aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_transport_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/scsi_transport_spi.c')
-rw-r--r--drivers/scsi/scsi_transport_spi.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
index 380e1671eb18..46da6fe10ad5 100644
--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -379,9 +379,7 @@ static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate);
379 379
380/* Translate the period into ns according to the current spec 380/* Translate the period into ns according to the current spec
381 * for SDTR/PPR messages */ 381 * for SDTR/PPR messages */
382static ssize_t 382static int period_to_str(char *buf, int period)
383show_spi_transport_period_helper(struct class_device *cdev, char *buf,
384 int period)
385{ 383{
386 int len, picosec; 384 int len, picosec;
387 385
@@ -399,6 +397,14 @@ show_spi_transport_period_helper(struct class_device *cdev, char *buf,
399 len = sprint_frac(buf, picosec, 1000); 397 len = sprint_frac(buf, picosec, 1000);
400 } 398 }
401 399
400 return len;
401}
402
403static ssize_t
404show_spi_transport_period_helper(struct class_device *cdev, char *buf,
405 int period)
406{
407 int len = period_to_str(buf, period);
402 buf[len++] = '\n'; 408 buf[len++] = '\n';
403 buf[len] = '\0'; 409 buf[len] = '\0';
404 return len; 410 return len;
@@ -1065,9 +1071,23 @@ static const char * const two_byte_msgs[] = {
1065 1071
1066static const char * const extended_msgs[] = { 1072static const char * const extended_msgs[] = {
1067/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", 1073/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request",
1068/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" 1074/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request",
1075/* 0x04 */ "Parallel Protocol Request"
1069}; 1076};
1070 1077
1078void print_nego(const unsigned char *msg, int per, int off, int width)
1079{
1080 if (per) {
1081 char buf[20];
1082 period_to_str(buf, msg[per]);
1083 printk("period = %s ns ", buf);
1084 }
1085
1086 if (off)
1087 printk("offset = %d ", msg[off]);
1088 if (width)
1089 printk("width = %d ", 8 << msg[width]);
1090}
1071 1091
1072int spi_print_msg(const unsigned char *msg) 1092int spi_print_msg(const unsigned char *msg)
1073{ 1093{
@@ -1085,11 +1105,13 @@ int spi_print_msg(const unsigned char *msg)
1085 (msg[4] << 16) | (msg[5] << 8) | msg[6]); 1105 (msg[4] << 16) | (msg[5] << 8) | msg[6]);
1086 break; 1106 break;
1087 case EXTENDED_SDTR: 1107 case EXTENDED_SDTR:
1088 printk("period = %d ns, offset = %d", 1108 print_nego(msg, 3, 4, 0);
1089 (int) msg[3] * 4, (int) msg[4]);
1090 break; 1109 break;
1091 case EXTENDED_WDTR: 1110 case EXTENDED_WDTR:
1092 printk("width = 2^%d bytes", msg[3]); 1111 print_nego(msg, 0, 0, 3);
1112 break;
1113 case EXTENDED_PPR:
1114 print_nego(msg, 3, 5, 6);
1093 break; 1115 break;
1094 default: 1116 default:
1095 for (i = 2; i < len; ++i) 1117 for (i = 2; i < len; ++i)