Date: Sat, 6 Jun 2009 19:38:35 GMT From: Alexander Motin <mav@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 163659 for review Message-ID: <200906061938.n56JcZsV055245@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163659 Change 163659 by mav@mav_mavbook on 2009/06/06 19:38:30 Add new port typs SATA and teach AHCI controller report it's real data rate, and XPT to print it. Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#17 edit .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#89 edit .. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#12 edit .. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.h#5 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#17 (text+ko) ==== @@ -228,6 +228,7 @@ XPORT_PPB, /* Parallel Port Bus */ XPORT_ATA, /* AT Attachment */ XPORT_SAS, /* Serial Attached SCSI */ + XPORT_SATA, /* Serial AT Attachment */ } cam_xport; #define PROTO_VERSION_UNKNOWN (UINT_MAX - 1) @@ -778,6 +779,11 @@ u_int32_t bitrate; /* Mbps */ }; +struct ccb_trans_settings_sata { + u_int valid; /* Which fields to honor */ +#define CTS_SATA_VALID_SPEED 0x1000 + u_int32_t bitrate; /* Mbps */ +}; /* Get/Set transfer rate/width/disconnection/tag queueing settings */ struct ccb_trans_settings { @@ -796,6 +802,7 @@ struct ccb_trans_settings_spi spi; struct ccb_trans_settings_fc fc; struct ccb_trans_settings_sas sas; + struct ccb_trans_settings_sata sata; } xport_specific; }; ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#89 (text+ko) ==== @@ -1080,19 +1080,20 @@ if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) speed *= (0x01 << spi->bus_width); } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) { struct ccb_trans_settings_fc *fc = &cts.xport_specific.fc; - if (fc->valid & CTS_FC_VALID_SPEED) { + if (fc->valid & CTS_FC_VALID_SPEED) speed = fc->bitrate; - } } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SAS) { struct ccb_trans_settings_sas *sas = &cts.xport_specific.sas; - if (sas->valid & CTS_SAS_VALID_SPEED) { + if (sas->valid & CTS_SAS_VALID_SPEED) speed = sas->bitrate; - } + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = &cts.xport_specific.sata; + if (sata->valid & CTS_SATA_VALID_SPEED) + speed = sata->bitrate; } mb = speed / 1000; @@ -3802,6 +3803,7 @@ new_bus->xport = scsi_get_xport(); break; case XPORT_ATA: + case XPORT_SATA: new_bus->xport = ata_get_xport(); break; default: ==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#12 (text+ko) ==== @@ -109,9 +109,6 @@ if (pci_get_progif(dev) != PCIP_STORAGE_SATA_AHCI_1_0) return (ENXIO); - if (pci_get_devid(dev) != 0x2363197b) - return (ENXIO); - device_set_desc_copy(dev, "AHCI controller"); return (BUS_PROBE_VENDOR); } @@ -1694,14 +1691,26 @@ /* Get default/user set transfer settings for the target */ { struct ccb_trans_settings *cts = &ccb->cts; + uint32_t status; cts->protocol = PROTO_ATA; cts->protocol_version = SCSI_REV_2; - cts->transport = XPORT_ATA; + cts->transport = XPORT_SATA; cts->transport_version = 2; cts->proto_specific.valid = 0; - cts->xport_specific.valid = 0; - + cts->xport_specific.sata.valid = CTS_SATA_VALID_SPEED; + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + status = ATA_IDX_INL(ch, ATA_SSTATUS) & ATA_SS_SPD_MASK; + else + status = ATA_IDX_INL(ch, ATA_SCONTROL) & ATA_SC_SPD_MASK; + if (status & ATA_SS_SPD_GEN3) + cts->xport_specific.sata.bitrate = 600000; + else if (status & ATA_SS_SPD_GEN2) + cts->xport_specific.sata.bitrate = 300000; + else if (status & ATA_SS_SPD_GEN1) + cts->xport_specific.sata.bitrate = 150000; + else + cts->xport_specific.sata.valid = 0; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); break; @@ -1764,7 +1773,7 @@ strncpy(cpi->hba_vid, "AHCI", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); cpi->unit_number = cam_sim_unit(sim); - cpi->transport = XPORT_ATA; + cpi->transport = XPORT_SATA; cpi->transport_version = 2; if ((ATA_ATAPI_MASTER << ccb->ccb_h.target_id) & ch->devices) cpi->protocol = PROTO_SCSI; ==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.h#5 (text+ko) ==== @@ -97,6 +97,7 @@ #define ATA_SS_SPD_NO_SPEED 0x00000000 #define ATA_SS_SPD_GEN1 0x00000010 #define ATA_SS_SPD_GEN2 0x00000020 +#define ATA_SS_SPD_GEN3 0x00000040 #define ATA_SS_IPM_MASK 0x00000f00 #define ATA_SS_IPM_NO_DEVICE 0x00000000 @@ -139,6 +140,7 @@ #define ATA_SC_SPD_NO_SPEED 0x00000000 #define ATA_SC_SPD_SPEED_GEN1 0x00000010 #define ATA_SC_SPD_SPEED_GEN2 0x00000020 +#define ATA_SC_SPD_SPEED_GEN3 0x00000040 #define ATA_SC_IPM_MASK 0x00000f00 #define ATA_SC_IPM_NONE 0x00000000
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906061938.n56JcZsV055245>