Re: [PATCH 8/8] ide: add ->cable_detect method to ide_hwif_t

2008-01-12 Thread Sergei Shtylyov

Hello.

Bartlomiej Zolnierkiewicz wrote:


* Add ->cable_detect method to ide_hwif_t.



* Call the new method in ide_init_port() if:
  - the host supports UDMA modes > UDMA2 ('hwif->ultra_mask & 78')
  - DMA initialization was successful (if hwif->dma_base is not set
ide_init_port() sets hwif->ultra_mask to zero)
  - "idex=ata66" is not used ('hwif->cbl != ATA_CBL_PATA40_SHORT')



* Convert PCI host drivers to use ->cable_detect method.



While at it:



* Factor out cable detection to separate functions (if not already done).



* hpt366.c/it8213.c/slc90e66.c:
  - don't check cable type if "idex=ata66" is used



* pdc202xx_new.c:
  - add __devinit tag to pdcnew_cable_detect()



* pdc202xx_old.c:
  - rename pdc202xx_old_cable_detect() to pdc2026x_old_cable_detect()
  - add __devinit tag to pdc2026x_old_cable_detect()



Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>



Index: b/drivers/ide/ide-probe.c
===
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1343,6 +1343,11 @@ static void ide_init_port(ide_hwif_t *hw
/* call chipset specific routine for each enabled port */
if (d->init_hwif)
d->init_hwif(hwif);
+
+   if (hwif->cable_detect && (hwif->ultra_mask & 0x78)) {
+   if (hwif->cbl != ATA_CBL_PATA40_SHORT)
+   hwif->cbl = hwif->cable_detect(hwif);
+   }


   Could be collapsed to a single *if* statement...


Index: b/drivers/ide/pci/alim15x3.c
===
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -666,13 +666,12 @@ static void __devinit init_hwif_common_a
hwif->set_dma_mode = _set_dma_mode;
hwif->udma_filter = _udma_filter;
 
+	hwif->cable_detect = ata66_ali15x3;


   Why not give that function a "standard" name while at it?


 static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
Index: b/drivers/ide/pci/cmd64x.c
===
--- a/drivers/ide/pci/cmd64x.c
+++ b/drivers/ide/pci/cmd64x.c
@@ -393,6 +393,8 @@ static void __devinit init_hwif_cmd64x(i
hwif->set_pio_mode = _set_pio_mode;
hwif->set_dma_mode = _set_dma_mode;
 
+	hwif->cable_detect = ata66_cmd64x;

+


   Same question...


Index: b/drivers/ide/pci/hpt366.c
===
--- a/drivers/ide/pci/hpt366.c
+++ b/drivers/ide/pci/hpt366.c
@@ -1279,12 +1279,55 @@ static unsigned int __devinit init_chips
return dev->irq;
 }
 
+static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif)

+{
+   struct pci_dev  *dev= to_pci_dev(hwif->dev);
+   struct hpt_info *info   = pci_get_drvdata(dev);
+   u8 chip_type= info->chip_type;
+   u8 scr1 = 0, ata66  = hwif->channel ? 0x01 : 0x02;


   The 'ata66' is pretty bad name for this variable (reversed sense), let's 
go with 'mask'...



+
+   /*
+* The HPT37x uses the CBLID pins as outputs for MA15/MA16
+* address lines to access an external EEPROM.  To read valid
+* cable detect state the pins must be enabled as inputs.
+*/
+   if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
+   /*
+* HPT374 PCI function 1
+* - set bit 15 of reg 0x52 to enable TCBLID as input
+* - set bit 15 of reg 0x56 to enable FCBLID as input
+*/
+   u8  mcr_addr = hwif->select_data + 2;
+   u16 mcr;
+
+   pci_read_config_word(dev, mcr_addr, );
+   pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
+   /* now read cable id register */
+   pci_read_config_byte(dev, 0x5a, );
+   pci_write_config_word(dev, mcr_addr, mcr);
+   } else if (chip_type >= HPT370) {
+   /*
+* HPT370/372 and 374 pcifn 0
+* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
+*/
+   u8 scr2 = 0;
+
+   pci_read_config_byte(dev, 0x5b, );
+   pci_write_config_byte(dev, 0x5b, (scr2 & ~1));
+   /* now read cable id register */
+   pci_read_config_byte(dev, 0x5a, );
+   pci_write_config_byte(dev, 0x5b,  scr2);


   Sigh, my pretty formatting is gone... at least don't leave double spaces 
and needless parens. :-)



+   } else
+   pci_read_config_byte(dev, 0x5a, );
+
+   return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+}
+

[...]

--- a/drivers/ide/pci/it8213.c
+++ b/drivers/ide/pci/it8213.c
Index: b/drivers/ide/pci/it821x.c
===
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -579,14 +579,13 @@ static void __devinit init_hwif_it821x(i
} else

Re: [PATCH 8/8] ide: add -cable_detect method to ide_hwif_t

2008-01-12 Thread Sergei Shtylyov

Hello.

Bartlomiej Zolnierkiewicz wrote:


* Add -cable_detect method to ide_hwif_t.



* Call the new method in ide_init_port() if:
  - the host supports UDMA modes  UDMA2 ('hwif-ultra_mask  78')
  - DMA initialization was successful (if hwif-dma_base is not set
ide_init_port() sets hwif-ultra_mask to zero)
  - idex=ata66 is not used ('hwif-cbl != ATA_CBL_PATA40_SHORT')



* Convert PCI host drivers to use -cable_detect method.



While at it:



* Factor out cable detection to separate functions (if not already done).



* hpt366.c/it8213.c/slc90e66.c:
  - don't check cable type if idex=ata66 is used



* pdc202xx_new.c:
  - add __devinit tag to pdcnew_cable_detect()



* pdc202xx_old.c:
  - rename pdc202xx_old_cable_detect() to pdc2026x_old_cable_detect()
  - add __devinit tag to pdc2026x_old_cable_detect()



Signed-off-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED]



Index: b/drivers/ide/ide-probe.c
===
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1343,6 +1343,11 @@ static void ide_init_port(ide_hwif_t *hw
/* call chipset specific routine for each enabled port */
if (d-init_hwif)
d-init_hwif(hwif);
+
+   if (hwif-cable_detect  (hwif-ultra_mask  0x78)) {
+   if (hwif-cbl != ATA_CBL_PATA40_SHORT)
+   hwif-cbl = hwif-cable_detect(hwif);
+   }


   Could be collapsed to a single *if* statement...


Index: b/drivers/ide/pci/alim15x3.c
===
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -666,13 +666,12 @@ static void __devinit init_hwif_common_a
hwif-set_dma_mode = ali_set_dma_mode;
hwif-udma_filter = ali_udma_filter;
 
+	hwif-cable_detect = ata66_ali15x3;


   Why not give that function a standard name while at it?


 static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
Index: b/drivers/ide/pci/cmd64x.c
===
--- a/drivers/ide/pci/cmd64x.c
+++ b/drivers/ide/pci/cmd64x.c
@@ -393,6 +393,8 @@ static void __devinit init_hwif_cmd64x(i
hwif-set_pio_mode = cmd64x_set_pio_mode;
hwif-set_dma_mode = cmd64x_set_dma_mode;
 
+	hwif-cable_detect = ata66_cmd64x;

+


   Same question...


Index: b/drivers/ide/pci/hpt366.c
===
--- a/drivers/ide/pci/hpt366.c
+++ b/drivers/ide/pci/hpt366.c
@@ -1279,12 +1279,55 @@ static unsigned int __devinit init_chips
return dev-irq;
 }
 
+static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif)

+{
+   struct pci_dev  *dev= to_pci_dev(hwif-dev);
+   struct hpt_info *info   = pci_get_drvdata(dev);
+   u8 chip_type= info-chip_type;
+   u8 scr1 = 0, ata66  = hwif-channel ? 0x01 : 0x02;


   The 'ata66' is pretty bad name for this variable (reversed sense), let's 
go with 'mask'...



+
+   /*
+* The HPT37x uses the CBLID pins as outputs for MA15/MA16
+* address lines to access an external EEPROM.  To read valid
+* cable detect state the pins must be enabled as inputs.
+*/
+   if (chip_type == HPT374  (PCI_FUNC(dev-devfn)  1)) {
+   /*
+* HPT374 PCI function 1
+* - set bit 15 of reg 0x52 to enable TCBLID as input
+* - set bit 15 of reg 0x56 to enable FCBLID as input
+*/
+   u8  mcr_addr = hwif-select_data + 2;
+   u16 mcr;
+
+   pci_read_config_word(dev, mcr_addr, mcr);
+   pci_write_config_word(dev, mcr_addr, (mcr | 0x8000));
+   /* now read cable id register */
+   pci_read_config_byte(dev, 0x5a, scr1);
+   pci_write_config_word(dev, mcr_addr, mcr);
+   } else if (chip_type = HPT370) {
+   /*
+* HPT370/372 and 374 pcifn 0
+* - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
+*/
+   u8 scr2 = 0;
+
+   pci_read_config_byte(dev, 0x5b, scr2);
+   pci_write_config_byte(dev, 0x5b, (scr2  ~1));
+   /* now read cable id register */
+   pci_read_config_byte(dev, 0x5a, scr1);
+   pci_write_config_byte(dev, 0x5b,  scr2);


   Sigh, my pretty formatting is gone... at least don't leave double spaces 
and needless parens. :-)



+   } else
+   pci_read_config_byte(dev, 0x5a, scr1);
+
+   return (scr1  ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+}
+

[...]

--- a/drivers/ide/pci/it8213.c
+++ b/drivers/ide/pci/it8213.c
Index: b/drivers/ide/pci/it821x.c
===
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -579,14 +579,13 @@ static void __devinit init_hwif_it821x(i
} else
hwif-host_flags |= 

[PATCH 8/8] ide: add ->cable_detect method to ide_hwif_t

2008-01-06 Thread Bartlomiej Zolnierkiewicz
* Add ->cable_detect method to ide_hwif_t.

* Call the new method in ide_init_port() if:
  - the host supports UDMA modes > UDMA2 ('hwif->ultra_mask & 78')
  - DMA initialization was successful (if hwif->dma_base is not set
ide_init_port() sets hwif->ultra_mask to zero)
  - "idex=ata66" is not used ('hwif->cbl != ATA_CBL_PATA40_SHORT')

* Convert PCI host drivers to use ->cable_detect method.

While at it:

* Factor out cable detection to separate functions (if not already done).

* hpt366.c/it8213.c/slc90e66.c:
  - don't check cable type if "idex=ata66" is used

* pdc202xx_new.c:
  - add __devinit tag to pdcnew_cable_detect()

* pdc202xx_old.c:
  - rename pdc202xx_old_cable_detect() to pdc2026x_old_cable_detect()
  - add __devinit tag to pdc2026x_old_cable_detect()

Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
---
-105 bytes
 drivers/ide/ide-probe.c|5 ++
 drivers/ide/pci/aec62xx.c  |   25 +---
 drivers/ide/pci/alim15x3.c |5 --
 drivers/ide/pci/amd74xx.c  |   18 
 drivers/ide/pci/atiixp.c   |6 --
 drivers/ide/pci/cmd64x.c   |5 --
 drivers/ide/pci/cs5535.c   |6 --
 drivers/ide/pci/hpt366.c   |   84 ++---
 drivers/ide/pci/it8213.c   |   21 +-
 drivers/ide/pci/it821x.c   |5 --
 drivers/ide/pci/jmicron.c  |6 --
 drivers/ide/pci/pdc202xx_new.c |8 ---
 drivers/ide/pci/pdc202xx_old.c |   10 ++--
 drivers/ide/pci/piix.c |7 ---
 drivers/ide/pci/scc_pata.c |3 -
 drivers/ide/pci/serverworks.c  |9 
 drivers/ide/pci/siimage.c  |5 --
 drivers/ide/pci/sis5513.c  |5 --
 drivers/ide/pci/slc90e66.c |   19 +
 drivers/ide/pci/tc86c001.c |   24 +++
 drivers/ide/pci/via82cxxx.c|6 --
 include/linux/ide.h|2 
 22 files changed, 137 insertions(+), 147 deletions(-)

Index: b/drivers/ide/ide-probe.c
===
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1343,6 +1343,11 @@ static void ide_init_port(ide_hwif_t *hw
/* call chipset specific routine for each enabled port */
if (d->init_hwif)
d->init_hwif(hwif);
+
+   if (hwif->cable_detect && (hwif->ultra_mask & 0x78)) {
+   if (hwif->cbl != ATA_CBL_PATA40_SHORT)
+   hwif->cbl = hwif->cable_detect(hwif);
+   }
 }
 
 int ide_device_add_all(u8 idx[MAX_HWIFS], const struct ide_port_info *d)
Index: b/drivers/ide/pci/aec62xx.c
===
--- a/drivers/ide/pci/aec62xx.c
+++ b/drivers/ide/pci/aec62xx.c
@@ -166,6 +166,16 @@ static unsigned int __devinit init_chips
return dev->irq;
 }
 
+static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
+{
+   struct pci_dev *dev = to_pci_dev(hwif->dev);
+   u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
+
+   pci_read_config_byte(dev, 0x49, );
+
+   return (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+}
+
 static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
 {
struct pci_dev *dev = to_pci_dev(hwif->dev);
@@ -174,21 +184,10 @@ static void __devinit init_hwif_aec62xx(
 
if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
hwif->set_dma_mode = _set_mode;
-   else
+   else {
hwif->set_dma_mode = _set_mode;
 
-   if (hwif->dma_base == 0)
-   return;
-
-   if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF)
-   return;
-
-   if (hwif->cbl != ATA_CBL_PATA40_SHORT) {
-   u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01;
-
-   pci_read_config_byte(dev, 0x49, );
-
-   hwif->cbl = (ata66 & mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+   hwif->cable_detect = atp86x_cable_detect;
}
 }
 
Index: b/drivers/ide/pci/alim15x3.c
===
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -666,13 +666,12 @@ static void __devinit init_hwif_common_a
hwif->set_dma_mode = _set_dma_mode;
hwif->udma_filter = _udma_filter;
 
+   hwif->cable_detect = ata66_ali15x3;
+
if (hwif->dma_base == 0)
return;
 
hwif->dma_setup = _dma_setup;
-
-   if (hwif->cbl != ATA_CBL_PATA40_SHORT)
-   hwif->cbl = ata66_ali15x3(hwif);
 }
 
 /**
Index: b/drivers/ide/pci/amd74xx.c
===
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -199,6 +199,14 @@ static unsigned int __devinit init_chips
return dev->irq;
 }
 
+static u8 __devinit amd_cable_detect(ide_hwif_t *hwif)
+{
+   if ((amd_80w >> hwif->channel) & 1)
+   return ATA_CBL_PATA80;
+   else
+   return ATA_CBL_PATA40;
+}
+
 static void __devinit 

[PATCH 8/8] ide: add -cable_detect method to ide_hwif_t

2008-01-06 Thread Bartlomiej Zolnierkiewicz
* Add -cable_detect method to ide_hwif_t.

* Call the new method in ide_init_port() if:
  - the host supports UDMA modes  UDMA2 ('hwif-ultra_mask  78')
  - DMA initialization was successful (if hwif-dma_base is not set
ide_init_port() sets hwif-ultra_mask to zero)
  - idex=ata66 is not used ('hwif-cbl != ATA_CBL_PATA40_SHORT')

* Convert PCI host drivers to use -cable_detect method.

While at it:

* Factor out cable detection to separate functions (if not already done).

* hpt366.c/it8213.c/slc90e66.c:
  - don't check cable type if idex=ata66 is used

* pdc202xx_new.c:
  - add __devinit tag to pdcnew_cable_detect()

* pdc202xx_old.c:
  - rename pdc202xx_old_cable_detect() to pdc2026x_old_cable_detect()
  - add __devinit tag to pdc2026x_old_cable_detect()

Signed-off-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED]
---
-105 bytes
 drivers/ide/ide-probe.c|5 ++
 drivers/ide/pci/aec62xx.c  |   25 +---
 drivers/ide/pci/alim15x3.c |5 --
 drivers/ide/pci/amd74xx.c  |   18 
 drivers/ide/pci/atiixp.c   |6 --
 drivers/ide/pci/cmd64x.c   |5 --
 drivers/ide/pci/cs5535.c   |6 --
 drivers/ide/pci/hpt366.c   |   84 ++---
 drivers/ide/pci/it8213.c   |   21 +-
 drivers/ide/pci/it821x.c   |5 --
 drivers/ide/pci/jmicron.c  |6 --
 drivers/ide/pci/pdc202xx_new.c |8 ---
 drivers/ide/pci/pdc202xx_old.c |   10 ++--
 drivers/ide/pci/piix.c |7 ---
 drivers/ide/pci/scc_pata.c |3 -
 drivers/ide/pci/serverworks.c  |9 
 drivers/ide/pci/siimage.c  |5 --
 drivers/ide/pci/sis5513.c  |5 --
 drivers/ide/pci/slc90e66.c |   19 +
 drivers/ide/pci/tc86c001.c |   24 +++
 drivers/ide/pci/via82cxxx.c|6 --
 include/linux/ide.h|2 
 22 files changed, 137 insertions(+), 147 deletions(-)

Index: b/drivers/ide/ide-probe.c
===
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1343,6 +1343,11 @@ static void ide_init_port(ide_hwif_t *hw
/* call chipset specific routine for each enabled port */
if (d-init_hwif)
d-init_hwif(hwif);
+
+   if (hwif-cable_detect  (hwif-ultra_mask  0x78)) {
+   if (hwif-cbl != ATA_CBL_PATA40_SHORT)
+   hwif-cbl = hwif-cable_detect(hwif);
+   }
 }
 
 int ide_device_add_all(u8 idx[MAX_HWIFS], const struct ide_port_info *d)
Index: b/drivers/ide/pci/aec62xx.c
===
--- a/drivers/ide/pci/aec62xx.c
+++ b/drivers/ide/pci/aec62xx.c
@@ -166,6 +166,16 @@ static unsigned int __devinit init_chips
return dev-irq;
 }
 
+static u8 __devinit atp86x_cable_detect(ide_hwif_t *hwif)
+{
+   struct pci_dev *dev = to_pci_dev(hwif-dev);
+   u8 ata66 = 0, mask = hwif-channel ? 0x02 : 0x01;
+
+   pci_read_config_byte(dev, 0x49, ata66);
+
+   return (ata66  mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+}
+
 static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif)
 {
struct pci_dev *dev = to_pci_dev(hwif-dev);
@@ -174,21 +184,10 @@ static void __devinit init_hwif_aec62xx(
 
if (dev-device == PCI_DEVICE_ID_ARTOP_ATP850UF)
hwif-set_dma_mode = aec6210_set_mode;
-   else
+   else {
hwif-set_dma_mode = aec6260_set_mode;
 
-   if (hwif-dma_base == 0)
-   return;
-
-   if (dev-device == PCI_DEVICE_ID_ARTOP_ATP850UF)
-   return;
-
-   if (hwif-cbl != ATA_CBL_PATA40_SHORT) {
-   u8 ata66 = 0, mask = hwif-channel ? 0x02 : 0x01;
-
-   pci_read_config_byte(dev, 0x49, ata66);
-
-   hwif-cbl = (ata66  mask) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
+   hwif-cable_detect = atp86x_cable_detect;
}
 }
 
Index: b/drivers/ide/pci/alim15x3.c
===
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -666,13 +666,12 @@ static void __devinit init_hwif_common_a
hwif-set_dma_mode = ali_set_dma_mode;
hwif-udma_filter = ali_udma_filter;
 
+   hwif-cable_detect = ata66_ali15x3;
+
if (hwif-dma_base == 0)
return;
 
hwif-dma_setup = ali15x3_dma_setup;
-
-   if (hwif-cbl != ATA_CBL_PATA40_SHORT)
-   hwif-cbl = ata66_ali15x3(hwif);
 }
 
 /**
Index: b/drivers/ide/pci/amd74xx.c
===
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -199,6 +199,14 @@ static unsigned int __devinit init_chips
return dev-irq;
 }
 
+static u8 __devinit amd_cable_detect(ide_hwif_t *hwif)
+{
+   if ((amd_80w  hwif-channel)  1)
+   return ATA_CBL_PATA80;
+   else
+   return ATA_CBL_PATA40;
+}
+
 static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
 {