PERFORCE change 170153 for review
Alexander Motin
mav at FreeBSD.org
Wed Nov 4 09:17:07 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=170153
Change 170153 by mav at mav_mavtest on 2009/11/04 09:16:31
Add support for sector size > 512 bytes and physical sector of
several logical sectors, intruduced by ATA-7 specification.
Affected files ...
.. //depot/projects/scottl-camlock/src/sbin/camcontrol/camcontrol.c#27 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#19 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#18 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_da.c#39 edit
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#50 edit
.. //depot/projects/scottl-camlock/src/sys/sys/ata.h#14 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sbin/camcontrol/camcontrol.c#27 (text+ko) ====
@@ -1061,6 +1061,10 @@
printf("cylinders %d\n", parm->cylinders);
printf("heads %d\n", parm->heads);
printf("sectors/track %d\n", parm->sectors);
+ printf("sector size logical %u, physical %lu, offset %lu\n",
+ ata_logical_sector_size(parm),
+ (unsigned long)ata_physical_sector_size(parm),
+ (unsigned long)ata_logical_sector_offset(parm));
if (parm->config == ATA_PROTO_CFA ||
(parm->support.command2 & ATA_SUPPORT_CFA))
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.c#19 (text+ko) ====
@@ -271,6 +271,38 @@
printf(" device\n");
}
+uint32_t
+ata_logical_sector_size(struct ata_params *ident_data)
+{
+ if ((ident_data->pss & 0xc000) == 0x4000 &&
+ (ident_data->pss & ATA_PSS_LSSABOVE512)) {
+ return ((u_int32_t)ident_data->lss_1 |
+ ((u_int32_t)ident_data->lss_2 << 16));
+ }
+ return (512);
+}
+
+uint64_t
+ata_physical_sector_size(struct ata_params *ident_data)
+{
+ if ((ident_data->pss & 0xc000) == 0x4000 &&
+ (ident_data->pss & ATA_PSS_MULTLS)) {
+ return ((uint64_t)ata_logical_sector_size(ident_data) *
+ (1 << (ident_data->pss & ATA_PSS_LSPPS)));
+ }
+ return (512);
+}
+
+uint64_t
+ata_logical_sector_offset(struct ata_params *ident_data)
+{
+ if ((ident_data->lsalign & 0xc000) == 0x4000) {
+ return ((uint64_t)ata_logical_sector_size(ident_data) *
+ (ident_data->lsalign & 0x3fff));
+ }
+ return (0);
+}
+
void
ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
uint32_t lba, uint8_t sector_count)
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_all.h#18 (text+ko) ====
@@ -92,6 +92,10 @@
void ata_print_ident(struct ata_params *ident_data);
+uint32_t ata_logical_sector_size(struct ata_params *ident_data);
+uint64_t ata_physical_sector_size(struct ata_params *ident_data);
+uint64_t ata_logical_sector_offset(struct ata_params *ident_data);
+
void ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
uint32_t lba, uint8_t sector_count);
void ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features,
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_da.c#39 (text+ko) ====
@@ -95,10 +95,10 @@
struct disk_params {
u_int8_t heads;
+ u_int8_t secs_per_track;
u_int32_t cylinders;
- u_int8_t secs_per_track;
- u_int32_t secsize; /* Number of bytes/sector */
- u_int64_t sectors; /* total number sectors */
+ u_int32_t secsize; /* Number of bytes/logical sector */
+ u_int64_t sectors; /* Total number sectors */
};
struct ada_softc {
@@ -140,7 +140,7 @@
union ccb *done_ccb);
static int adaerror(union ccb *ccb, u_int32_t cam_flags,
u_int32_t sense_flags);
-static void adasetgeom(struct cam_periph *periph,
+static void adagetparams(struct cam_periph *periph,
struct ccb_getdev *cgd);
static timeout_t adasendorderedtag;
static void adashutdown(void *arg, int howto);
@@ -653,6 +653,7 @@
* Register this media as a disk
*/
mtx_unlock(periph->sim->mtx);
+ adagetparams(periph, cgd);
softc->disk = disk_alloc();
softc->disk->d_open = adaopen;
softc->disk->d_close = adaclose;
@@ -666,9 +667,9 @@
else if (maxio > MAXPHYS)
maxio = MAXPHYS; /* for safety */
if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48)
- maxio = min(maxio, 65536 * 512);
+ maxio = min(maxio, 65536 * softc->params.secsize);
else /* 28bit ATA command limit */
- maxio = min(maxio, 256 * 512);
+ maxio = min(maxio, 256 * softc->params.secsize);
softc->disk->d_maxsize = maxio;
softc->disk->d_unit = periph->unit_number;
softc->disk->d_flags = 0;
@@ -677,9 +678,12 @@
strlcpy(softc->disk->d_ident, cgd->serial_num,
MIN(sizeof(softc->disk->d_ident), cgd->serial_num_len + 1));
- adasetgeom(periph, cgd);
softc->disk->d_sectorsize = softc->params.secsize;
- softc->disk->d_mediasize = softc->params.secsize * (off_t)softc->params.sectors;
+ softc->disk->d_mediasize = (off_t)softc->params.sectors *
+ softc->params.secsize;
+ softc->disk->d_stripesize = ata_physical_sector_size(&cgd->ident_data);
+ softc->disk->d_stripeoffset = softc->disk->d_stripesize -
+ ata_logical_sector_offset(&cgd->ident_data);
/* XXX: these are not actually "firmware" values, so they may be wrong */
softc->disk->d_fwsectors = softc->params.secs_per_track;
softc->disk->d_fwheads = softc->params.heads;
@@ -963,14 +967,14 @@
}
static void
-adasetgeom(struct cam_periph *periph, struct ccb_getdev *cgd)
+adagetparams(struct cam_periph *periph, struct ccb_getdev *cgd)
{
struct ada_softc *softc = (struct ada_softc *)periph->softc;
struct disk_params *dp = &softc->params;
u_int64_t lbasize48;
u_int32_t lbasize;
- dp->secsize = 512;
+ dp->secsize = ata_logical_sector_size(&cgd->ident_data);
if ((cgd->ident_data.atavalid & ATA_FLAG_54_58) &&
cgd->ident_data.current_heads && cgd->ident_data.current_sectors) {
dp->heads = cgd->ident_data.current_heads;
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#50 (text+ko) ====
@@ -363,10 +363,12 @@
cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
cts.type = CTS_TYPE_CURRENT_SETTINGS;
if (path->device->transport == XPORT_ATA) {
- cts.xport_specific.ata.bytecount = sectors * 512;
+ cts.xport_specific.ata.bytecount = sectors *
+ ata_logical_sector_size(ident_buf);
cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
} else {
- cts.xport_specific.sata.bytecount = sectors * 512;
+ cts.xport_specific.sata.bytecount = sectors *
+ ata_logical_sector_size(ident_buf);
cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
}
xpt_action((union ccb *)&cts);
==== //depot/projects/scottl-camlock/src/sys/sys/ata.h#14 (text+ko) ====
@@ -234,7 +234,7 @@
/*176*/ u_int8_t media_serial[60];
/*206*/ u_int16_t sct;
u_int16_t reserved206[2];
-/*209*/ u_int16_t lbalign;
+/*209*/ u_int16_t lsalign;
/*210*/ u_int16_t wrv_sectors_m3_1;
u_int16_t wrv_sectors_m3_2;
/*212*/ u_int16_t wrv_sectors_m2_1;
More information about the p4-projects
mailing list