Author: zergin                       Date: Sat May 27 13:06:03 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- patch for 2.6 kernels to support PATA ports on Promise SATA contorllers

---- Files affected:
SOURCES:
   linux-2.6-sata-promise-pata-ports.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/linux-2.6-sata-promise-pata-ports.patch
diff -u /dev/null SOURCES/linux-2.6-sata-promise-pata-ports.patch:1.1
--- /dev/null   Sat May 27 15:06:03 2006
+++ SOURCES/linux-2.6-sata-promise-pata-ports.patch     Sat May 27 15:05:58 2006
@@ -0,0 +1,128 @@
+diff -urN linux-2.6.16.16/drivers/scsi/libata-core.c 
mod/drivers/scsi/libata-core.c
+--- linux-2.6.16.16/drivers/scsi/libata-core.c 2006-05-11 03:56:24.000000000 
+0200
++++ mod/drivers/scsi/libata-core.c     2006-05-20 03:14:57.165778500 +0200
+@@ -4431,6 +4431,7 @@
+       ap->mwdma_mask = ent->mwdma_mask;
+       ap->udma_mask = ent->udma_mask;
+       ap->flags |= ent->host_flags;
++      ap->flags |= ent->port_flags[port_no];  /* pata fix */
+       ap->ops = ent->port_ops;
+       ap->cbl = ATA_CBL_NONE;
+       ap->active_tag = ATA_TAG_POISON;
+diff -urN linux-2.6.16.16/drivers/scsi/sata_promise.c 
mod/drivers/scsi/sata_promise.c
+--- linux-2.6.16.16/drivers/scsi/sata_promise.c        2006-05-11 
03:56:24.000000000 +0200
++++ mod/drivers/scsi/sata_promise.c    2006-05-20 03:29:36.708746500 +0200
+@@ -165,7 +165,7 @@
+       /* board_2037x */
+       {
+               .sht            = &pdc_ata_sht,
+-              .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
++              .host_flags     = PDC_COMMON_FLAGS /* | ATA_FLAG_SATA */,       
/* pata fix */
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
+@@ -322,15 +322,34 @@
+ 
+ static void pdc_sata_phy_reset(struct ata_port *ap)
+ {
+-      pdc_reset_port(ap);
+-      sata_phy_reset(ap);
++/*    pdc_reset_port(ap); */  /* pata fix */
++/*    sata_phy_reset(ap); */  /* pata fix */
++      /* if no sata flag, test for pata drive */      /* pata fix */
++      if (ap->flags & ATA_FLAG_SATA)  /* pata fix */
++      {                               /* pata fix */
++              pdc_reset_port(ap);     /* pata fix */
++              sata_phy_reset(ap);     /* pata fix */
++      }                               /* pata fix */
++      else                            /* pata fix */
++              pdc_pata_phy_reset(ap); /* pata fix */
+ }
+ 
+ static void pdc_pata_phy_reset(struct ata_port *ap)
+ {
+       /* FIXME: add cable detect.  Don't assume 40-pin cable */
+-      ap->cbl = ATA_CBL_PATA40;
+-      ap->udma_mask &= ATA_UDMA_MASK_40C;
++/*    ap->cbl = ATA_CBL_PATA40; */                    /* pata fix */
++/*    ap->udma_mask &= ATA_UDMA_MASK_40C; */          /* pata fix */
++      /* add cable detection code for pata drives */  /* pata fix */
++      u8 tmp;                                         /* pata fix */
++      void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata 
fix */
++      tmp = readb(mmio);                              /* pata fix */
++      if (tmp & 0x01)                                 /* pata fix */
++      {                                               /* pata fix */
++              ap->cbl = ATA_CBL_PATA40;               /* pata fix */
++              ap->udma_mask &= ATA_UDMA_MASK_40C;     /* pata fix */
++      }                                               /* pata fix */
++      else                                            /* pata fix */
++              ap->cbl = ATA_CBL_PATA80;               /* pata fix */
+ 
+       pdc_reset_port(ap);
+       ata_port_probe(ap);
+@@ -646,6 +665,7 @@
+       unsigned int board_idx = (unsigned int) ent->driver_data;
+       int pci_dev_busy = 0;
+       int rc;
++      u8 tmp;         /* pata fix */
+ 
+       if (!printed_version++)
+               dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
+@@ -705,6 +725,9 @@
+       probe_ent->port[0].scr_addr = base + 0x400;
+       probe_ent->port[1].scr_addr = base + 0x500;
+ 
++      probe_ent->port_flags[0] = ATA_FLAG_SATA;       /* pata fix */
++      probe_ent->port_flags[1] = ATA_FLAG_SATA;       /* pata fix */
++      
+       /* notice 4-port boards */
+       switch (board_idx) {
+       case board_20319:
+@@ -715,9 +738,25 @@
+ 
+               probe_ent->port[2].scr_addr = base + 0x600;
+               probe_ent->port[3].scr_addr = base + 0x700;
++
++              probe_ent->port_flags[2] = ATA_FLAG_SATA;       /* pata fix */
++              probe_ent->port_flags[3] = ATA_FLAG_SATA;       /* pata fix */
+               break;
+       case board_2037x:
+-              probe_ent->n_ports = 2;
++/*            probe_ent->n_ports = 2; */                                      
/* pata fix */
++/*            Some boards have also PATA port */                              
/* pata fix */
++
++              tmp = readb(mmio_base + PDC_FLASH_CTL+1);                       
/* pata fix */
++              if (!(tmp & 0x80))                                              
/* pata fix */
++              {                                                               
/* pata fix */
++                      probe_ent->n_ports = 3;                                 
/* pata fix */
++                      pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);  
/* pata fix */
++                      probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS;         
/* pata fix */
++                      printk(KERN_INFO DRV_NAME " PATA port found\n");        
/* pata fix */
++              }                                                               
/* pata fix */
++              else                                                            
/* pata fix */
++                      probe_ent->n_ports = 2;                                 
/* pata fix */
++              
+               break;
+       case board_20771:
+               probe_ent->n_ports = 2;
+@@ -730,6 +769,9 @@
+ 
+               probe_ent->port[2].scr_addr = base + 0x600;
+               probe_ent->port[3].scr_addr = base + 0x700;
++
++              probe_ent->port_flags[2] = ATA_FLAG_SATA;       /* pata fix */
++              probe_ent->port_flags[3] = ATA_FLAG_SATA;       /* pata fix */
+               break;
+       default:
+               BUG();
+diff -urN linux-2.6.16.16/include/linux/libata.h mod/include/linux/libata.h
+--- linux-2.6.16.16/include/linux/libata.h     2006-05-11 03:56:24.000000000 
+0200
++++ mod/include/linux/libata.h 2006-05-20 03:31:46.216840250 +0200
+@@ -237,6 +237,7 @@
+       unsigned long           irq;
+       unsigned int            irq_flags;
+       unsigned long           host_flags;
++      unsigned long           port_flags[ATA_MAX_PORTS];      /* pata fix */
+       void __iomem            *mmio_base;
+       void                    *private_data;
+ };
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to