2.4.x SATA update
PATCH 1/1 2.4.x SATA update
Please pull from the 'upstream' branch of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-2.4.git
which will update 2.4.x SATA to the latest, according to the attached diffstat/changelog/patch.
drivers/scsi/ahci.c | 127 ++++++--- drivers/scsi/ata_piix.c | 32 +- drivers/scsi/libata-core.c | 555 +++++++++++++++++++++++++++++++++++++----- drivers/scsi/libata-scsi.c | 18 - drivers/scsi/libata.h | 2 drivers/scsi/sata_nv.c | 2 drivers/scsi/sata_promise.c | 30 ++ drivers/scsi/sata_qstor.c | 2 drivers/scsi/sata_sil.c | 10 drivers/scsi/sata_sis.c | 1 drivers/scsi/sata_svw.c | 28 +- drivers/scsi/sata_sx4.c | 2 drivers/scsi/sata_uli.c | 1 drivers/scsi/sata_via.c | 1 drivers/scsi/sata_vsc.c | 1 include/linux/ata.h | 1 include/linux/libata-compat.h | 3 include/linux/libata.h | 67 +++++ 18 files changed, 741 insertions(+), 142 deletions(-)
commit c9a8f5ab981ced23e95b72b25aa83e37880f2287
Author: Jeff Garzik <[email protected]> Date: Sat Jul 23 20:12:48 2005 -0400
libata: update to 2.6.x latest
Minor stuff:
* doc updates
* pci id updates
* new ->host_stop behavior
* fix bugs in PIO data xfer, SATA probe, large disk SCSI xlat
drivers/scsi/ahci.c +85 -42
@@ -38,7 +38,8 @@#include <asm/io.h> #define DRV_NAME "ahci" -#define DRV_VERSION "1.00" +#define DRV_VERSION "1.01" +enum {AHCI_PCI_BAR =5 ,
@@ -48,6 +49,7 @@ enum {AHCI_CMD_SLOT_SZ =32 *32 ,AHCI_RX_FIS_SZ =256 ,AHCI_CMD_TBL_HDR =0x80 , +AHCI_CMD_TBL_CDB =0x40 ,AHCI_CMD_TBL_SZ =AHCI_CMD_TBL_HDR + (AHCI_MAX_SG *16 ),AHCI_PORT_PRIV_DMA_SZ =AHCI_CMD_SLOT_SZ +AHCI_CMD_TBL_SZ + AHCI_RX_FIS_SZ,
@@ -132,6 +134,9 @@ enum {PORT_CMD_ICC_ACTIVE = (0x1 <<28 ),/* Put i/f in active state */ PORT_CMD_ICC_PARTIAL = (0x2 <<28 ),/* Put i/f in partial state */ PORT_CMD_ICC_SLUMBER = (0x6 <<28 ),/* Put i/f in slumber state */ + +/* hpriv->flags bits */ + AHCI_FLAG_MSI = (1 << 0), }; struct ahci_cmd_hdr {
@@ -181,13 +186,14 @@ static void ahci_qc_prep(struct ata_queustatic u8 ahci_check_status (struct ata_port *ap);static u8 ahci_check_err (struct ata_port *ap);static inline int ahci_host_intr (struct ata_port *ap,struct ata_queued_cmd *qc); +static void ahci_remove_one (struct pci_dev *pdev);static Scsi_Host_Template ahci_sht = { .module =THIS_MODULE , .name =DRV_NAME , - .ioctl = ata_scsi_ioctl, .detect = ata_scsi_detect, .release = ata_scsi_release, + .ioctl = ata_scsi_ioctl, .queuecommand = ata_scsi_queuecmd, .eh_strategy_handler = ata_scsi_error, .can_queue =ATA_DEF_QUEUE ,
@@ -256,6 +262,12 @@ static struct pci_device_id ahci_pci_tbl board_ahci }, /* ICH7R */ {PCI_VENDOR_ID_AL ,0x5288 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_ahci }, /* ULi M5288 */ + { PCI_VENDOR_ID_INTEL, 0x2681, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ESB2 */ + { PCI_VENDOR_ID_INTEL, 0x2682, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ESB2 */ + { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ESB2 */ { } /* terminate list */ };
@@ -264,7 +276,7 @@ static struct pci_driver ahci_pci_driver .name = DRV_NAME, .id_table = ahci_pci_tbl, .probe = ahci_init_one, - .remove = ata_pci_remove_one, + .remove = ahci_remove_one, };
@@ -282,6 +294,8 @@ static void ahci_host_stop(struct ata_ho {struct ahci_host_priv *hpriv = host_set->private_data;kfree (hpriv); + +ata_host_stop (host_set); }static int ahci_port_start (struct ata_port *ap)
@@ -289,26 +303,19 @@ static int ahci_port_start(struct ata_postruct device *dev = ap->host_set->dev;struct ahci_host_priv *hpriv = ap->host_set->private_data;struct ahci_port_priv *pp; -int rc;void *mem, *mmio = ap->host_set->mmio_base;void *port_mmio =ahci_port_base (mmio, ap->port_no);dma_addr_t mem_dma; - rc =ata_port_start (ap); -if (rc) -return rc; - pp =kmalloc (sizeof (*pp),GFP_KERNEL ); -if (!pp) { - rc = -ENOMEM ; - goto err_out; - } +if (!pp) +return -ENOMEM ;memset (pp,0 ,sizeof (*pp)); mem =dma_alloc_coherent (dev,AHCI_PORT_PRIV_DMA_SZ , &mem_dma,GFP_KERNEL );if (!mem) { - rc = -ENOMEM ; - goto err_out_kfree; +kfree (pp); +return -ENOMEM ; }memset (mem,0 ,AHCI_PORT_PRIV_DMA_SZ );
@@ -358,12 +365,6 @@ static int ahci_port_start(struct ata_poreadl (port_mmio +PORT_CMD );/* flush */ return 0 ; - -err_out_kfree: -kfree (pp); -err_out: -ata_port_stop (ap); -return rc; }
@@ -389,7 +390,6 @@ static void ahci_port_stop(struct ata_podma_free_coherent (dev,AHCI_PORT_PRIV_DMA_SZ , pp->cmd_slot, pp->cmd_slot_dma);kfree (pp); -ata_port_stop (ap); }static u32 ahci_scr_read (struct ata_port *ap,unsigned int sc_reg_in)
@@ -496,7 +496,8 @@ static void ahci_fill_sg(struct ata_queustatic void ahci_qc_prep (struct ata_queued_cmd *qc) { -struct ahci_port_priv *pp = qc->ap->private_data; +struct ata_port *ap = qc->ap; +struct ahci_port_priv *pp = ap->private_data;u32 opts;const u32 cmd_fis_len =5 ;/* five dwords */
@@ -508,18 +509,8 @@ static void ahci_qc_prep(struct ata_queu opts = (qc->n_elem <<16 ) | cmd_fis_len;if (qc->tf.flags &ATA_TFLAG_WRITE ) opts |=AHCI_CMD_WRITE ; - -switch (qc->tf.protocol) { -case ATA_PROT_ATAPI : -case ATA_PROT_ATAPI_NODATA : -case ATA_PROT_ATAPI_DMA : +if (is_atapi_taskfile (&qc->tf)) opts |=AHCI_CMD_ATAPI ; -break ; - -default : -/* do nothing */ -break ; - } pp->cmd_slot[0 ].opts =cpu_to_le32 (opts); pp->cmd_slot[0 ].status =0 ;
@@ -531,6 +522,10 @@ static void ahci_qc_prep(struct ata_queu* a SATA Register - Host to Device command FIS. */ ata_tf_to_fis (&qc->tf, pp->cmd_tbl,0 ); +if (opts &AHCI_CMD_ATAPI ) { +memset (pp->cmd_tbl +AHCI_CMD_TBL_CDB ,0 ,32 ); +memcpy (pp->cmd_tbl +AHCI_CMD_TBL_CDB , qc->cdb, ap->cdb_len); + }if (!(qc->flags &ATA_QCFLAG_DMAMAP ))return ;
@@ -853,15 +848,19 @@ static int ahci_host_init(struct ata_pro }/* move to PCI layer, integrate w/ MSI stuff */ -static void pci_enable_intx (struct pci_dev *pdev) +static void pci_intx (struct pci_dev *pdev,int enable) { -u16 pci_command; +u16 pci_command, new;pci_read_config_word (pdev,PCI_COMMAND , &pci_command); -if (pci_command &PCI_COMMAND_INTX_DISABLE ) { - pci_command &= ~PCI_COMMAND_INTX_DISABLE ; + +if (enable) + new = pci_command & ~PCI_COMMAND_INTX_DISABLE ; +else + new = pci_command |PCI_COMMAND_INTX_DISABLE ; + +if (new != pci_command)pci_write_config_word (pdev,PCI_COMMAND , pci_command); - } }static void ahci_print_info (struct ata_probe_ent *probe_ent)
@@ -943,7 +942,7 @@ static int ahci_init_one (struct pci_devunsigned long base;void *mmio_base;unsigned int board_idx = (unsigned int ) ent->driver_data; -int pci_dev_busy =0 ; +int have_msi, pci_dev_busy =0 ;int rc;VPRINTK ("ENTER\n" );
@@ -961,12 +960,17 @@ static int ahci_init_one (struct pci_dev goto err_out; } -pci_enable_intx (pdev); +if (pci_enable_msi (pdev) ==0 ) + have_msi =1 ; +else { +pci_intx (pdev,1 ); + have_msi =0 ; + } probe_ent =kmalloc (sizeof (*probe_ent),GFP_KERNEL );if (probe_ent ==NULL ) { rc = -ENOMEM ; - goto err_out_regions; + goto err_out_msi; }memset (probe_ent,0 ,sizeof (*probe_ent));
@@ -999,6 +1003,9 @@ static int ahci_init_one (struct pci_dev probe_ent->mmio_base = mmio_base; probe_ent->private_data = hpriv; +if (have_msi) + hpriv->flags |=AHCI_FLAG_MSI ; +/* initialize adapter */ rc =ahci_host_init (probe_ent);if (rc)
@@ -1016,7 +1023,11 @@ err_out_iounmap:iounmap (mmio_base); err_out_free_ent:kfree (probe_ent); -err_out_regions: +err_out_msi: +if (have_msi) +pci_disable_msi (pdev); +else +pci_intx (pdev,0 );pci_release_regions (pdev); err_out:if (!pci_dev_busy)
@@ -1024,6 +1035,38 @@ err_out:return rc; } +static void ahci_remove_one (struct pci_dev *pdev) +{ +struct device *dev =pci_dev_to_dev (pdev); +struct ata_host_set *host_set =dev_get_drvdata (dev); +struct ahci_host_priv *hpriv = host_set->private_data; +struct ata_port *ap; +Scsi_Host_Template *sht; +int have_msi, rc; + +/* FIXME: this unregisters all ports attached to the +* Scsi_Host_Template given. We _might_ have multiple +* templates (though we don't ATM), so this is ok... for now. +*/ + ap = host_set->ports[0 ]; + sht = ap->host->hostt; + rc =scsi_unregister_module (MODULE_SCSI_HA , sht); +/* FIXME: handle 'rc' failure? */ + + have_msi = hpriv->flags &AHCI_FLAG_MSI ; +free_irq (host_set->irq, host_set); + + host_set->ops->host_stop (host_set); +kfree (host_set); + +if (have_msi) +pci_disable_msi (pdev); +else +pci_intx (pdev,0 ); +pci_release_regions (pdev); +pci_disable_device (pdev); +dev_set_drvdata (dev,NULL ); +}static int __init ahci_init (void ) {
drivers/scsi/ata_piix.c +16 -16
@@ -61,6 +61,7 @@ enum { ich6_sata =3 , ich6_sata_rm =4 , ich7_sata =5 , + esb2_sata = 6, }; static int piix_init_one (struct pci_dev *pdev,
@@ -93,6 +94,7 @@ static struct pci_device_id piix_pci_tbl { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm }, { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata }, { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata }, + { 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, esb2_sata }, { } /* terminate list */ };
@@ -151,6 +153,7 @@ static struct ata_port_operations piix_p .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_operations piix_sata_ops = {
@@ -178,6 +181,7 @@ static struct ata_port_operations piix_s .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info piix_port_info[] = {
@@ -256,6 +260,18 @@ static struct ata_port_info piix_port_in .udma_mask = 0x7f, /* udma0-6 */ .port_ops = &piix_sata_ops, }, + +/* esb2_sata */ + { + .sht = &piix_sht, + .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST | + PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR | + ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x7f, /* udma0-6 */ + .port_ops = &piix_sata_ops, + }, };static struct pci_bits piix_enable_bits[] = {
@@ -650,15 +666,6 @@ static int piix_init_one (struct pci_devreturn ata_pci_init_one (pdev, port_info, n_ports); } -/** -* piix_init - -* -* LOCKING: -* -* RETURNS: -* -*/ -static int __init piix_init (void ) {int rc;
@@ -685,13 +692,6 @@ err_out:return rc; } -/** -* piix_exit - -* -* LOCKING: -* -*/ - static void __exit piix_exit(void) {scsi_unregister_module (MODULE_SCSI_HA , &piix_sht);
drivers/scsi/libata-core.c +490 -65
1,081 lines not on this page · raw message
drivers/scsi/libata-scsi.c +12 -6
@@ -906,7 +906,7 @@ unsigned int ata_scsiop_inq_83(struct at }/** -* ata_scsiop_noop - +* ata_scsiop_noop - Command handler that simply returns success. * @args: device IDENTIFY data / SCSI command of interest. * @rbuf: Response buffer, to which simulated SCSI cmd output is sent. * @buflen: Response buffer length.
@@ -1135,8 +1135,12 @@ unsigned int ata_scsiop_read_cap(struct n_sectors =ata_id_u32 (args->id,60 ); n_sectors--;/* ATA TotalUserSectors - 1 */ - tmp = n_sectors;/* note: truncates, if lba48 */ if (args->cmd->cmnd[0 ] ==READ_CAPACITY ) { +if ( n_sectors >=0xffffffffULL ) + tmp =0xffffffff ;/* Return max count on overflow */ +else + tmp = n_sectors ; +/* sector count, 32-bit */ rbuf[0 ] = tmp >> (8 *3 ); rbuf[1 ] = tmp >> (8 *2 );
@@ -1150,10 +1154,12 @@ unsigned int ata_scsiop_read_cap(struct }else {/* sector count, 64-bit */ - rbuf[2 ] = n_sectors >> (8 *7 ); - rbuf[3 ] = n_sectors >> (8 *6 ); - rbuf[4 ] = n_sectors >> (8 *5 ); - rbuf[5 ] = n_sectors >> (8 *4 ); + tmp = n_sectors >> (8 *4 ); + rbuf[2 ] = tmp >> (8 *3 ); + rbuf[3 ] = tmp >> (8 *2 ); + rbuf[4 ] = tmp >> (8 *1 ); + rbuf[5 ] = tmp; + tmp = n_sectors; rbuf[6 ] = tmp >> (8 *3 ); rbuf[7 ] = tmp >> (8 *2 ); rbuf[8 ] = tmp >> (8 *1 );
drivers/scsi/libata.h +1 -1
@@ -26,7 +26,7 @@#define __LIBATA_H__#define DRV_NAME "libata" -#define DRV_VERSION "1.10"/* must be exactly four chars */ +#define DRV_VERSION "1.11"/* must be exactly four chars */ struct ata_scsi_args {u16 *id;
drivers/scsi/sata_nv.c +2 -0
@@ -329,6 +329,8 @@ static void nv_host_stop (struct ata_hos host->host_desc->disable_hotplug (host_set);kfree (host); + +ata_host_stop (host_set); }static int nv_init_one (struct pci_dev *pdev,const struct pci_device_id *ent)
drivers/scsi/sata_promise.c +29 -1
@@ -42,6 +42,7 @@#define DRV_NAME "sata_promise"#define DRV_VERSION "1.01" +enum {PDC_PKT_SUBMIT =0x40 ,/* Command packet pointer addr */ PDC_INT_SEQMASK =0x40 ,/* Mask of asserted SEQ INTs */
@@ -58,6 +59,7 @@ enum { board_2037x =0 ,/* FastTrak S150 TX2plus */ board_20319 =1 ,/* FastTrak S150 TX4 */ + board_20619 =2 ,/* FastTrak TX4000 */ PDC_HAS_PATA = (1 << 1), /* PDC20375 has PATA */
@@ -121,6 +123,7 @@ static struct ata_port_operations pdc_at .scr_write = pdc_sata_scr_write, .port_start = pdc_port_start, .port_stop = pdc_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info pdc_port_info[] = {
@@ -145,11 +148,24 @@ static struct ata_port_info pdc_port_inf .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &pdc_ata_ops, }, + +/* board_20619 */ + { + .sht = &pdc_ata_sht, + .host_flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST | + ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x7f, /* udma0-6 ; FIXME */ + .port_ops = &pdc_ata_ops, + }, };static struct pci_device_id pdc_ata_pci_tbl[] = { {PCI_VENDOR_ID_PROMISE ,0x3371 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_2037x }, + {PCI_VENDOR_ID_PROMISE ,0x3571 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + board_2037x }, {PCI_VENDOR_ID_PROMISE ,0x3373 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_2037x }, {PCI_VENDOR_ID_PROMISE ,0x3375 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,
@@ -168,6 +184,9 @@ static struct pci_device_id pdc_ata_pci_ {PCI_VENDOR_ID_PROMISE ,0x3d18 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , board_20319 }, + { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_20619 }, + { } /* terminate list */ };
@@ -629,6 +648,15 @@ static int pdc_ata_init_one (struct pci_case board_2037x: probe_ent->n_ports =2 ;break ; +case board_20619: + probe_ent->n_ports =4 ; + +pdc_ata_setup_port (&probe_ent->port[2 ], base +0x300 ); +pdc_ata_setup_port (&probe_ent->port[3 ], base +0x380 ); + + probe_ent->port[2 ].scr_addr = base +0x600 ; + probe_ent->port[3 ].scr_addr = base +0x700 ; +break ;default :BUG ();break ;
@@ -684,7 +712,7 @@ static void __exit pdc_ata_exit(void)MODULE_AUTHOR ("Jeff Garzik" ); -MODULE_DESCRIPTION ("Promise SATA TX2/TX4 low-level driver" ); +MODULE_DESCRIPTION ("Promise ATA TX2/TX4/TX4000 low-level driver" );MODULE_LICENSE ("GPL" );MODULE_DEVICE_TABLE (pci, pdc_ata_pci_tbl);MODULE_VERSION (DRV_VERSION );
drivers/scsi/sata_qstor.c +2 -0
@@ -537,6 +537,8 @@ static void qs_host_stop(struct ata_hostwriteb (0 , mmio_base +QS_HCT_CTRL );/* disable host interrupts */ writeb (QS_CNFG3_GSRST , mmio_base +QS_HCF_CNFG3 );/* global reset */ + +ata_host_stop (host_set); }static void qs_host_init (unsigned int chip_id,struct ata_probe_ent *pe)
drivers/scsi/sata_sil.c +9 -1
@@ -82,6 +82,7 @@ static struct pci_device_id sil_pci_tbl[ { 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 }, { 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, { 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, + { 0x1002, 0x437a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, { } /* terminate list */ };
@@ -160,6 +161,7 @@ static struct ata_port_operations sil_op .scr_write = sil_scr_write, .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info sil_port_info[] = {
@@ -427,7 +429,13 @@ static int sil_init_one (struct pci_devwriteb (cls, mmio_base +SIL_FIFO_R0 );writeb (cls, mmio_base +SIL_FIFO_W0 );writeb (cls, mmio_base +SIL_FIFO_R1 ); -writeb (cls, mmio_base +SIL_FIFO_W2 ); +writeb (cls, mmio_base +SIL_FIFO_W1 ); +if (ent->driver_data == sil_3114) { +writeb (cls, mmio_base +SIL_FIFO_R2 ); +writeb (cls, mmio_base +SIL_FIFO_W2 ); +writeb (cls, mmio_base +SIL_FIFO_R3 ); +writeb (cls, mmio_base +SIL_FIFO_W3 ); + } }else printk(KERN_WARNING DRV_NAME "(%s): cache line size not set. Driver may not function\n",pci_name (pdev));
drivers/scsi/sata_sis.c +1 -0
@@ -114,6 +114,7 @@ static struct ata_port_operations sis_op .scr_write = sis_scr_write, .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info sis_port_info = {
drivers/scsi/sata_svw.c +18 -10
@@ -49,7 +49,7 @@#endif /* CONFIG_PPC_OF */ #define DRV_NAME "sata_svw" -#define DRV_VERSION "1.05" +#define DRV_VERSION "1.06"/* Taskfile registers offsets */ #define K2_SATA_TF_CMD_OFFSET 0x00
@@ -313,6 +313,7 @@ static struct ata_port_operations k2_sat .scr_write = k2_sata_scr_write, .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static void k2_sata_setup_port (struct ata_ioports *port,unsigned long base)
@@ -343,6 +344,7 @@ static int k2_sata_init_one (struct pci_void *mmio_base;int pci_dev_busy =0 ;int rc; +int i;if (!printed_version++) printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -417,11 +419,11 @@ static int k2_sata_init_one (struct pci_ probe_ent->mwdma_mask =0x7 ; probe_ent->udma_mask =0x7f ; -/* We have 4 ports per PCI function */ -k2_sata_setup_port (&probe_ent->port[0 ], base +0 *K2_SATA_PORT_OFFSET ); -k2_sata_setup_port (&probe_ent->port[1 ], base +1 *K2_SATA_PORT_OFFSET ); -k2_sata_setup_port (&probe_ent->port[2 ], base +2 *K2_SATA_PORT_OFFSET ); -k2_sata_setup_port (&probe_ent->port[3 ], base +3 *K2_SATA_PORT_OFFSET ); +/* different controllers have different number of ports - currently 4 or 8 */ +/* All ports are on the same function. Multi-function device is no +* longer available. This should not be seen in any system. */ +for (i =0 ; i < ent->driver_data; i++) +k2_sata_setup_port (&probe_ent->port[i], base + i *K2_SATA_PORT_OFFSET );pci_set_master (pdev);
@@ -439,11 +441,17 @@ err_out:return rc; } - +/* 0x240 is device ID for Apple K2 device +* 0x241 is device ID for Serverworks Frodo4 +* 0x242 is device ID for Serverworks Frodo8 +* 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA +* controller +* */ static struct pci_device_id k2_sata_pci_tbl[] = { - {0x1166 ,0x0240 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, - {0x1166 ,0x0241 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, - {0x1166 ,0x0242 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,0 }, + {0x1166 ,0x0240 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,4 }, + {0x1166 ,0x0241 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,4 }, + {0x1166 ,0x0242 ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,8 }, + {0x1166 ,0x024a ,PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,4 }, { } };
drivers/scsi/sata_sx4.c +2 -0
@@ -245,6 +245,8 @@ static void pdc20621_host_stop(struct atiounmap (dimm_mmio);kfree (hpriv); + +ata_host_stop (host_set); }static int pdc_port_start (struct ata_port *ap)
drivers/scsi/sata_uli.c +1 -0
@@ -113,6 +113,7 @@ static struct ata_port_operations uli_op .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info uli_port_info = {
drivers/scsi/sata_via.c +1 -0
@@ -134,6 +134,7 @@ static struct ata_port_operations svia_s .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static struct ata_port_info svia_port_info = {
drivers/scsi/sata_vsc.c +1 -0
@@ -230,6 +230,7 @@ static struct ata_port_operations vsc_sa .scr_write = vsc_sata_scr_write, .port_start = ata_port_start, .port_stop = ata_port_stop, + .host_stop = ata_host_stop, };static void __devinit vsc_sata_setup_port (struct ata_ioports *port,unsigned long base)
include/linux/ata.h +1 -0
@@ -224,6 +224,7 @@ struct ata_taskfile { };#define ata_id_is_ata (id) (((id)[0] & (1 << 15)) == 0) +#define ata_id_is_sata (id) ((id)[93] == 0)#define ata_id_rahead_enabled (id) ((id)[85] & (1 << 6))#define ata_id_wcache_enabled (id) ((id)[85] & (1 << 5))#define ata_id_has_flush (id) ((id)[83] & (1 << 12))
include/linux/libata-compat.h +3 -0
@@ -23,6 +23,9 @@ static inline struct pci_dev *to_pci_devreturn (struct pci_dev *) dev; } +static inline int pci_enable_msi (struct pci_dev *dev) {return -1 ; } +static inline void pci_disable_msi (struct pci_dev *dev) {} +#define pci_set_consistent_dma_mask (pdev,mask) (0)#define DMA_FROM_DEVICE PCI_DMA_FROMDEVICE
include/linux/libata.h +67 -0
115 lines not on this page · raw message
Quoted 16 lines · On Thu, 28 Jul 2005 15:46:32 -0400 Jeff Garzik wrote:
drivers/scsi/libata-core.c +16
-0+/** +* ata_sg_init_one - Associate command with memory buffer +* @qc: Command to be associated +* @buf: Memory buffer +* @buflen: Length of memory buffer, in bytes. +* +* Initialize the data-related elements of queued_cmd @qc +* to point to a single memory buffer, @buf of byte length @buflen. +* +* LOCKING: +* spin_lock_irqsave(host_set lock) +*/ + + + +/**
drivers/scsi/libata-core.c void ata_qc_prep(struct ata_queued_cmd * · line 2282
Quoted 10 lines
drivers/scsi/libata-core.c +10
-0+* ata_sg_init_one - Prepare a one-entry scatter-gather list. +* @qc: Queued command +* @buf: transfer buffer +* @buflen: length of buf +* +* Builds a single-entry scatter-gather list to initiate a +* transfer utilizing the specified buffer. +* +* LOCKING: +*/
Which one of the above duplicated comments for ata_sg_init_one is correct?
Quoted 15 lines
drivers/scsi/libata-core.c +15
-0+/** +* ata_sg_init - Associate command with scatter-gather table. +* @qc: Command to be associated +* @sg: Scatter-gather table. +* @n_elem: Number of elements in s/g table. +* +* Initialize the data-related elements of queued_cmd @qc +* to point to a scatter-gather table @sg, containing @n_elem +* elements. +* +* LOCKING: +* spin_lock_irqsave(host_set lock) +*/ + +
drivers/scsi/libata-core.c void ata_sg_init_one(struct ata_queued_c · line 2324
Quoted 10 lines
drivers/scsi/libata-core.c +10
-0+/** +* ata_sg_init - Assign a scatter gather list to a queued command +* @qc: Queued command +* @sg: Scatter-gather list +* @n_elem: length of sg list +* +* Attaches a scatter-gather list to a queued command. +* +* LOCKING: +*/
More duplicated comments.