libata : Add 40pin "short" cable support, honour drive side speed detection
PATCH 1/1 libata : Add 40pin "short" cable support, honour drive side speed detection
drivers/ata/ata_piix.c +28 -1
@@ -93,7 +93,7 @@#include <linux/libata.h> #define DRV_NAME "ata_piix" -#define DRV_VERSION "2.00ac6" +#define DRV_VERSION "2.00ac7"enum {PIIX_IOCFG =0x54 ,/* IDE I/O configuration register */
@@ -560,6 +560,23 @@MODULE_DEVICE_TABLE (pci, piix_pci_tbl);MODULE_VERSION (DRV_VERSION ); +struct ich_laptop { +u16 device; +u16 subvendor; +u16 subdevice; +}; + +/* +* List of laptops that use short cables rather than 80 wire +*/ + +static const struct ich_laptop ich_laptop[] = { +/* devid, subvendor, subdev */ + {0x27DF ,0x0005 ,0x0280 },/* ICH7 on Acer 5602WLMi */ +/* end marker */ + {0 , } +}; +/** * piix_pata_cbl_detect - Probe host controller cable detect info * @ap: Port for which cable detect info is desired
@@ -574,11 +591,21 @@static void ich_pata_cbl_detect (struct ata_port *ap) {struct pci_dev *pdev =to_pci_dev (ap->host_set->dev); +const struct ich_laptop *lap = &ich_laptop[0 ];u8 tmp, mask;/* no 80c support in host controller? */ if ((ap->udma_mask & ~ATA_UDMA_MASK_40C ) ==0 ) goto cbl40; + +/* Check for specials - Acer Aspire 5602WLMi */ +while (lap->device) { +if (lap->device == pdev->device && + lap->subvendor == pdev->subsystem_vendor && + lap->subdevice == pdev->subsystem_device) +return ATA_CBL_PATA40_SHORT ; + lap++; + }/* check BIOS cable detect results */ mask = ap->port_no ==0 ?PIIX_80C_PRI :PIIX_80C_SEC ;
drivers/ata/libata-core.c +7 -0
@@ -3092,6 +3092,13 @@*/ if (ap->cbl ==ATA_CBL_PATA40 ) xfer_mask &= ~(0xF8 <<ATA_SHIFT_UDMA ); +/* Apply drive side cable rule. Unknown or 80 pin cables reported +* host side are checked drive side as well. Cases where we know a +* 40wire cable is used safely for 80 are not checked here. +*/ +if (ata_drive_40wire (dev->id) && (ap->cbl ==ATA_CBL_PATA_UNK || ap->cbl ==ATA_CBL_PATA80 )) + xfer_mask &= ~(0xF8 <<ATA_SHIFT_UDMA ); + xfer_mask &=ata_pack_xfermask (dev->pio_mask, dev->mwdma_mask, dev->udma_mask);
drivers/ata/pata_ali.c +1 -1
@@ -78,7 +78,7 @@implement the detect logic */ if (ali_cable_override (pdev)) -return ATA_CBL_PATA80 ; +return ATA_CBL_PATA40_SHORT ;/* Host view cable detect 0x4A bit 0 primary bit 1 secondary Bit set for 40 pin */
include/linux/ata.h +12 -2
@@ -200,8 +200,9 @@ATA_CBL_NONE =0 ,ATA_CBL_PATA40 =1 ,ATA_CBL_PATA80 =2 , -ATA_CBL_PATA_UNK =3 , -ATA_CBL_SATA =4 , +ATA_CBL_PATA40_SHORT =3 ,/* 40 wire cable to high UDMA spec */ +ATA_CBL_PATA_UNK =4 , +ATA_CBL_SATA =5 ,/* SATA Status and Control Registers */ SCR_STATUS = 0,
@@ -342,6 +343,15 @@return 0 ; } +static inline int ata_drive_40wire (const u16 *dev_id) +{ +if (ata_id_major_version (dev_id) >=5 &&ata_id_is_sata (dev_id)) +return 0 ;/* SATA */ +if (dev_id[93 ] &0x4000 ) +return 0 ;/* 80 wire */ +return 1 ; +} +static inline int atapi_cdb_len (const u16 *dev_id) {u16 tmp = dev_id[0 ] &0x3 ;
ACK, but you need to split this up into core (#upstream) and PATA (#pata-drivers) patches.
Ar Iau, 2006-08-24 am 02:56 -0400, ysgrifennodd Jeff Garzik:
Quoted 2 lines
ACK, but you need to split this up into core (#upstream) and PATA (#pata-drivers) patches.
Its not really needed until you have pata drivers so I was planning to submit it only for the pata-drivers side of things ?
Alan
Quoted 5 lines · Alan Cox
Ar Iau, 2006-08-24 am 02:56 -0400, ysgrifennodd Jeff Garzik:
Quoted 1 line
ACK, but you need to split this up into core (#upstream) and PATA (#pata-drivers) patches.
Its not really needed until you have pata drivers so I was planning to submit it only for the pata-drivers side of things ?
The standard policy, in place since you began, has been to push core stuff into #upstream, and the driver side into #pata-drivers.
That way core changes aren't hidden away in #pata-drivers, and new PATA-related code is always compiled -- just like it will be, when the PATA drivers are in mainline.
Jeff
Ar Iau, 2006-08-24 am 09:51 -0400, ysgrifennodd Jeff Garzik:
Quoted 2 lines
The standard policy, in place since you began, has been to push core stuff into #upstream, and the driver side into #pata-drivers.
Jeff, I've no problem with putting it in upstream but all this talk of "standard policy" is crap. Or at least "standard policy" is a concept existing only in Jeff's brain and not documented clearly externally in this case...
Quoted 7 lines · Alan Cox
Ar Iau, 2006-08-24 am 09:51 -0400, ysgrifennodd Jeff Garzik:
Quoted 1 line
The standard policy, in place since you began, has been to push core stuff into #upstream, and the driver side into #pata-drivers.
Jeff, I've no problem with putting it in upstream but all this talk of "standard policy" is crap. Or at least "standard policy" is a concept existing only in Jeff's brain and not documented clearly externally in this case...
The pata-drivers branch has never received any libata*.[ch] changes in its entire lifetime, and you've no doubt noticed libata*.[ch] PATA work appearing in the upstream kernel, even when pata_*.c continues to not exist in the upstream kernel. Core stuff has always been split up; maybe I just didn't say that explicitly. Its pretty self-evident by looking at public commits, though.
Jeff