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

[SCSI] aic79xx: make driver respect nvram for IU and QAS settings

This patch allows the Adaptec firmware to pass on its values for Packetize and
QAS. To do this, the settings max_iu and max_qas have been introduced into
the SPI transport class and populated from the adaptec NVram tables. Domain
validation in the SPI transport class will respect the max settings when
configuring to the highest possible speed for testing.

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

+21 -11
+3 -7
drivers/scsi/aic7xxx/aic79xx_osm.c
··· 627 627 starget->id, &tstate); 628 628 629 629 if ((flags & CFPACKETIZED) == 0) { 630 - /* Do not negotiate packetized transfers */ 631 - spi_rd_strm(starget) = 0; 632 - spi_pcomp_en(starget) = 0; 633 - spi_rti(starget) = 0; 634 - spi_wr_flow(starget) = 0; 635 - spi_hold_mcs(starget) = 0; 630 + /* don't negotiate packetized (IU) transfers */ 631 + spi_max_iu(starget) = 0; 636 632 } else { 637 633 if ((ahd->features & AHD_RTI) == 0) 638 634 spi_rti(starget) = 0; 639 635 } 640 636 641 637 if ((flags & CFQAS) == 0) 642 - spi_qas(starget) = 0; 638 + spi_max_qas(starget) = 0; 643 639 644 640 /* Transinfo values have been set to BIOS settings */ 645 641 spi_max_width(starget) = (flags & CFWIDEB) ? 1 : 0;
+14 -4
drivers/scsi/scsi_transport_spi.c
··· 234 234 spi_width(starget) = 0; /* narrow */ 235 235 spi_max_width(starget) = 1; 236 236 spi_iu(starget) = 0; /* no IU */ 237 + spi_max_iu(starget) = 1; 237 238 spi_dt(starget) = 0; /* ST */ 238 239 spi_qas(starget) = 0; 240 + spi_max_qas(starget) = 1; 239 241 spi_wr_flow(starget) = 0; 240 242 spi_rd_strm(starget) = 0; 241 243 spi_rti(starget) = 0; ··· 362 360 /* The Parallel SCSI Tranport Attributes: */ 363 361 spi_transport_max_attr(offset, "%d\n"); 364 362 spi_transport_max_attr(width, "%d\n"); 365 - spi_transport_rd_attr(iu, "%d\n"); 363 + spi_transport_max_attr(iu, "%d\n"); 366 364 spi_transport_rd_attr(dt, "%d\n"); 367 - spi_transport_rd_attr(qas, "%d\n"); 365 + spi_transport_max_attr(qas, "%d\n"); 368 366 spi_transport_rd_attr(wr_flow, "%d\n"); 369 367 spi_transport_rd_attr(rd_strm, "%d\n"); 370 368 spi_transport_rd_attr(rti, "%d\n"); ··· 876 874 877 875 /* try QAS requests; this should be harmless to set if the 878 876 * target supports it */ 879 - if (scsi_device_qas(sdev)) { 877 + if (scsi_device_qas(sdev) && spi_max_qas(starget)) { 880 878 DV_SET(qas, 1); 881 879 } else { 882 880 DV_SET(qas, 0); 883 881 } 884 882 885 - if (scsi_device_ius(sdev) && min_period < 9) { 883 + if (scsi_device_ius(sdev) && spi_max_iu(starget) && min_period < 9) { 886 884 /* This u320 (or u640). Set IU transfers */ 887 885 DV_SET(iu, 1); 888 886 /* Then set the optional parameters */ ··· 1414 1412 else if (attr == &dev_attr_iu.attr && 1415 1413 spi_support_ius(starget)) 1416 1414 return TARGET_ATTRIBUTE_HELPER(iu); 1415 + else if (attr == &dev_attr_max_iu.attr && 1416 + spi_support_ius(starget)) 1417 + return TARGET_ATTRIBUTE_HELPER(iu); 1417 1418 else if (attr == &dev_attr_dt.attr && 1418 1419 spi_support_dt(starget)) 1419 1420 return TARGET_ATTRIBUTE_HELPER(dt); 1420 1421 else if (attr == &dev_attr_qas.attr && 1422 + spi_support_qas(starget)) 1423 + return TARGET_ATTRIBUTE_HELPER(qas); 1424 + else if (attr == &dev_attr_max_qas.attr && 1421 1425 spi_support_qas(starget)) 1422 1426 return TARGET_ATTRIBUTE_HELPER(qas); 1423 1427 else if (attr == &dev_attr_wr_flow.attr && ··· 1455 1447 &dev_attr_width.attr, 1456 1448 &dev_attr_max_width.attr, 1457 1449 &dev_attr_iu.attr, 1450 + &dev_attr_max_iu.attr, 1458 1451 &dev_attr_dt.attr, 1459 1452 &dev_attr_qas.attr, 1453 + &dev_attr_max_qas.attr, 1460 1454 &dev_attr_wr_flow.attr, 1461 1455 &dev_attr_rd_strm.attr, 1462 1456 &dev_attr_rti.attr,
+4
include/scsi/scsi_transport_spi.h
··· 36 36 unsigned int width:1; /* 0 - narrow, 1 - wide */ 37 37 unsigned int max_width:1; 38 38 unsigned int iu:1; /* Information Units enabled */ 39 + unsigned int max_iu:1; 39 40 unsigned int dt:1; /* DT clocking enabled */ 40 41 unsigned int qas:1; /* Quick Arbitration and Selection enabled */ 42 + unsigned int max_qas:1; 41 43 unsigned int wr_flow:1; /* Write Flow control enabled */ 42 44 unsigned int rd_strm:1; /* Read streaming enabled */ 43 45 unsigned int rti:1; /* Retain Training Information */ ··· 79 77 #define spi_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->width) 80 78 #define spi_max_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_width) 81 79 #define spi_iu(x) (((struct spi_transport_attrs *)&(x)->starget_data)->iu) 80 + #define spi_max_iu(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_iu) 82 81 #define spi_dt(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dt) 83 82 #define spi_qas(x) (((struct spi_transport_attrs *)&(x)->starget_data)->qas) 83 + #define spi_max_qas(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_qas) 84 84 #define spi_wr_flow(x) (((struct spi_transport_attrs *)&(x)->starget_data)->wr_flow) 85 85 #define spi_rd_strm(x) (((struct spi_transport_attrs *)&(x)->starget_data)->rd_strm) 86 86 #define spi_rti(x) (((struct spi_transport_attrs *)&(x)->starget_data)->rti)