Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

i2c: Consistently reject unsupported transactions

Many PC SMBus host controller drivers don't properly handle the case
where they are requested to achieve a transaction they do not support.
Update them so that the consistently print a warning message and
return a single error value in this case.

Signed-off-by: Jean Delvare <khali@linux-fr.org>

authored by

Jean Delvare and committed by
Jean Delvare
ac7fc4fb fa63cd56

+23 -34
+4 -4
drivers/i2c/busses/i2c-ali1535.c
··· 357 357 outb_p(0xFF, SMBHSTSTS); 358 358 359 359 switch (size) { 360 - case I2C_SMBUS_PROC_CALL: 361 - dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); 362 - result = -EOPNOTSUPP; 363 - goto EXIT; 364 360 case I2C_SMBUS_QUICK: 365 361 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), 366 362 SMBHSTADD); ··· 414 418 outb_p(data->block[i], SMBBLKDAT); 415 419 } 416 420 break; 421 + default: 422 + dev_warn(&adap->dev, "Unsupported transaction %d\n", size); 423 + result = -EOPNOTSUPP; 424 + goto EXIT; 417 425 } 418 426 419 427 result = ali1535_transaction(adap);
+4 -4
drivers/i2c/busses/i2c-ali1563.c
··· 246 246 247 247 /* Map the size to what the chip understands */ 248 248 switch (size) { 249 - case I2C_SMBUS_PROC_CALL: 250 - dev_err(&a->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); 251 - error = -EINVAL; 252 - break; 253 249 case I2C_SMBUS_QUICK: 254 250 size = HST_CNTL2_QUICK; 255 251 break; ··· 261 265 case I2C_SMBUS_BLOCK_DATA: 262 266 size = HST_CNTL2_BLOCK; 263 267 break; 268 + default: 269 + dev_warn(&a->dev, "Unsupported transaction %d\n", size); 270 + error = -EOPNOTSUPP; 271 + goto Done; 264 272 } 265 273 266 274 outb_p(((addr & 0x7f) << 1) | (rw & 0x01), SMB_HST_ADD);
+3 -3
drivers/i2c/busses/i2c-ali15x3.c
··· 362 362 } 363 363 364 364 switch (size) { 365 - case I2C_SMBUS_PROC_CALL: 366 - dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); 367 - return -EOPNOTSUPP; 368 365 case I2C_SMBUS_QUICK: 369 366 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), 370 367 SMBHSTADD); ··· 414 417 } 415 418 size = ALI15X3_BLOCK_DATA; 416 419 break; 420 + default: 421 + dev_warn(&adap->dev, "Unsupported transaction %d\n", size); 422 + return -EOPNOTSUPP; 417 423 } 418 424 419 425 outb_p(size, SMBHSTCNT); /* output command */
+3 -5
drivers/i2c/busses/i2c-amd756.c
··· 200 200 int i, len; 201 201 int status; 202 202 203 - /** TODO: Should I supporte the 10-bit transfers? */ 204 203 switch (size) { 205 - case I2C_SMBUS_PROC_CALL: 206 - dev_dbg(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); 207 - /* TODO: Well... It is supported, I'm just not sure what to do here... */ 208 - return -EOPNOTSUPP; 209 204 case I2C_SMBUS_QUICK: 210 205 outw_p(((addr & 0x7f) << 1) | (read_write & 0x01), 211 206 SMB_HOST_ADDRESS); ··· 247 252 } 248 253 size = AMD756_BLOCK_DATA; 249 254 break; 255 + default: 256 + dev_warn(&adap->dev, "Unsupported transaction %d\n", size); 257 + return -EOPNOTSUPP; 250 258 } 251 259 252 260 /* How about enabling interrupts... */
-1
drivers/i2c/busses/i2c-i801.c
··· 513 513 outb_p(command, SMBHSTCMD); 514 514 block = 1; 515 515 break; 516 - case I2C_SMBUS_PROC_CALL: 517 516 default: 518 517 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size); 519 518 return -EOPNOTSUPP;
+3 -3
drivers/i2c/busses/i2c-piix4.c
··· 307 307 int status; 308 308 309 309 switch (size) { 310 - case I2C_SMBUS_PROC_CALL: 311 - dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); 312 - return -EOPNOTSUPP; 313 310 case I2C_SMBUS_QUICK: 314 311 outb_p((addr << 1) | read_write, 315 312 SMBHSTADD); ··· 352 355 } 353 356 size = PIIX4_BLOCK_DATA; 354 357 break; 358 + default: 359 + dev_warn(&adap->dev, "Unsupported transaction %d\n", size); 360 + return -EOPNOTSUPP; 355 361 } 356 362 357 363 outb_p((size & 0x1C) + (ENABLE_INT9 & 1), SMBHSTCNT);
+2 -3
drivers/i2c/busses/i2c-sis630.c
··· 356 356 size = SIS630_BLOCK_DATA; 357 357 return sis630_block_data(adap, data, read_write); 358 358 default: 359 - printk("Unsupported SMBus operation\n"); 359 + dev_warn(&adap->dev, "Unsupported transaction %d\n", 360 + size); 360 361 return -EOPNOTSUPP; 361 362 } 362 363 ··· 379 378 case SIS630_WORD_DATA: 380 379 data->word = sis630_read(SMB_BYTE) + (sis630_read(SMB_BYTE + 1) << 8); 381 380 break; 382 - default: 383 - return -EOPNOTSUPP; 384 381 } 385 382 386 383 return 0;
+1 -7
drivers/i2c/busses/i2c-sis96x.c
··· 201 201 SIS96x_PROC_CALL : SIS96x_WORD_DATA); 202 202 break; 203 203 204 - case I2C_SMBUS_BLOCK_DATA: 205 - /* TO DO: */ 206 - dev_info(&adap->dev, "SMBus block not implemented!\n"); 207 - return -EOPNOTSUPP; 208 - break; 209 - 210 204 default: 211 - dev_info(&adap->dev, "Unsupported SMBus operation\n"); 205 + dev_warn(&adap->dev, "Unsupported transaction %d\n", size); 212 206 return -EOPNOTSUPP; 213 207 } 214 208
+2 -3
drivers/i2c/busses/i2c-taos-evm.c
··· 96 96 sprintf(p, "$%02X", command); 97 97 break; 98 98 default: 99 - dev_dbg(&adapter->dev, "Unsupported transaction size %d\n", 100 - size); 101 - return -EINVAL; 99 + dev_warn(&adapter->dev, "Unsupported transaction %d\n", size); 100 + return -EOPNOTSUPP; 102 101 } 103 102 104 103 /* Send the transaction to the TAOS EVM */
+1 -1
drivers/i2c/busses/i2c-viapro.c
··· 287 287 return 0; 288 288 289 289 exit_unsupported: 290 - dev_warn(&vt596_adapter.dev, "Unsupported command invoked! (0x%02x)\n", 290 + dev_warn(&vt596_adapter.dev, "Unsupported transaction %d\n", 291 291 size); 292 292 return -EOPNOTSUPP; 293 293 }