Index: sys/cam/scsi/scsi_da.c =================================================================== --- sys/cam/scsi/scsi_da.c (revision 254415) +++ sys/cam/scsi/scsi_da.c (working copy) @@ -98,9 +98,8 @@ DA_Q_NO_SYNC_CACHE = 0x01, DA_Q_NO_6_BYTE = 0x02, DA_Q_NO_PREVENT = 0x04, - DA_Q_4K = 0x08, DA_Q_NO_RC16 = 0x10 -} da_quirks; +} da_quirk_flags; #define DA_Q_BIT_STRING \ "\020" \ @@ -189,11 +188,22 @@ #define UNMAP_MAX_RANGES 2048 /* Protocol Max is 4095 */ #define UNMAP_BUF_SIZE ((UNMAP_MAX_RANGES * UNMAP_RANGE_SIZE) + \ UNMAP_HEAD_SIZE) +struct da_quirk_data { + da_quirk_flags flags; + u_int lbppbe; + u_int lalba; +}; +struct da_quirk_entry { + struct scsi_inquiry_pattern inq_pat; + struct da_quirk_data quirk_data; +}; + #define WS10_MAX_BLKS 0xffff #define WS16_MAX_BLKS 0xffffffff #define ATA_TRIM_MAX_RANGES ((UNMAP_BUF_SIZE / \ (ATA_DSM_RANGE_SIZE * ATA_DSM_BLK_SIZE)) * ATA_DSM_BLK_SIZE) +#define DA_ANNOUNCE_BUF_LEN 100 struct da_softc { struct bio_queue_head bio_queue; @@ -203,7 +213,7 @@ LIST_HEAD(, ccb_hdr) pending_ccbs; da_state state; da_flags flags; - da_quirks quirks; + struct da_quirk_data quirks; int sort_io_queue; int minimum_cmd_size; int error_inject; @@ -238,14 +248,11 @@ softc->delete_available &= ~(1 << delete_method); \ } -struct da_quirk_entry { - struct scsi_inquiry_pattern inq_pat; - da_quirks quirks; -}; - static const char quantum[] = "QUANTUM"; static const char microp[] = "MICROP"; +static struct da_quirk_data da_no_quirks_data; + static struct da_quirk_entry da_quirk_table[] = { /* SPI, FC devices */ @@ -257,12 +264,12 @@ * Reported by: W.Scholten */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "FUJITSU", "M2513A", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* See above. */ {T_OPTICAL, SIP_MEDIA_REMOVABLE, "FUJITSU", "M2513A", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -271,7 +278,7 @@ * Reported by: Tom Jackson */ {T_DIRECT, SIP_MEDIA_FIXED, "FUJITSU", "M2954*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -280,7 +287,7 @@ * in NetBSD PR kern/6027, August 24, 1998. */ {T_DIRECT, SIP_MEDIA_FIXED, microp, "2217*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -289,7 +296,7 @@ * (PR 8882). */ {T_DIRECT, SIP_MEDIA_FIXED, microp, "2112*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -297,7 +304,7 @@ * Reported by: Blaz Zupan */ {T_DIRECT, SIP_MEDIA_FIXED, "NEC", "D3847*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -305,14 +312,14 @@ * Reported by: Blaz Zupan */ {T_DIRECT, SIP_MEDIA_FIXED, quantum, "MAVERICK 540S", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Doesn't like the synchronize cache command. */ {T_DIRECT, SIP_MEDIA_FIXED, quantum, "LPS525S", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -320,7 +327,7 @@ * Reported by: walter@pelissero.de */ {T_DIRECT, SIP_MEDIA_FIXED, quantum, "LPS540S", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -330,12 +337,12 @@ * Reported by: Adam McDougall */ {T_DIRECT, SIP_MEDIA_FIXED, quantum, "VIKING 4*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE + { .flags = DA_Q_NO_6_BYTE } }, { /* See above. */ {T_DIRECT, SIP_MEDIA_FIXED, quantum, "VIKING 2*", "*"}, - /*quirks*/ DA_Q_NO_6_BYTE + { .flags = DA_Q_NO_6_BYTE } }, { /* @@ -343,14 +350,14 @@ * Reported by: walter@pelissero.de */ {T_DIRECT, SIP_MEDIA_FIXED, "CONNER", "CP3500*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * The CISS RAID controllers do not support SYNC_CACHE */ {T_DIRECT, SIP_MEDIA_FIXED, "COMPAQ", "RAID*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, /* USB mass storage devices supported by umass(4) */ { @@ -359,7 +366,7 @@ * PR: kern/51675 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "EXATEL", "i-BEAD10*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -367,7 +374,8 @@ * PR: kern/53067 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Generic*", "USB Flash Disk*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -375,7 +383,7 @@ * PR: kern/53094 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "CREATIVE", "NOMAD_MUVO", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT + { .flags = DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT } }, { /* @@ -383,7 +391,7 @@ * PR: kern/54737 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "JUNGSOFT", "NEXDISK*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -391,7 +399,8 @@ * PR: kern/54786 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "FreeDik*", "Mini Data Drive", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -399,7 +408,7 @@ * PR: kern/57046 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "SigmaTel", "MSCN", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT + { .flags = DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT } }, { /* @@ -407,7 +416,8 @@ * PR: kern/63645 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "NEUROS", "dig. audio comp.", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -415,7 +425,7 @@ * PR: kern/64563 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "SEAGRAND", "NP-900*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT + { .flags = DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT } }, { /* @@ -423,7 +433,7 @@ * PR: kern/54881, i386/63941, kern/66124 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "iRiver", "iFP*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -431,7 +441,7 @@ * PR: kern/70158 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "FL" , "Nex*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -439,14 +449,14 @@ * PR: kern/75057 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "ACTIONS*" , "USB DISK*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * TEAC USB floppy mechanisms */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "TEAC" , "FD-05*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -454,7 +464,8 @@ * Reported by: Pawel Jakub Dawidek */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Kingston" , "DataTraveler II+", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -463,7 +474,7 @@ * PR: usb/96381 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, " ", "USB DISK Pro", "PMAP"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -472,7 +483,8 @@ * PR: usb/89889 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Motorola" , "Motorola Phone", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -480,7 +492,8 @@ * PR: usb/79164 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "GENERIC", "USB DISK DEVICE", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -488,7 +501,8 @@ * PR: usb/81846 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB2.0*", "(FS) FLASH DISK*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -496,7 +510,8 @@ * PR: usb/90081 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB-DISK", "FreeDik-FlashUsb", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -504,23 +519,24 @@ * PR: usb/89196 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Kingston", "DataTraveler 2.0", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Creative MUVO Slim mp3 player (USB) * PR: usb/86131 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "CREATIVE", "MuVo Slim", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT + {T_DIRECT, SIP_MEDIA_REMOVABLE, "CREATIVE", "MuVo Slim", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE|DA_Q_NO_PREVENT } }, { /* * United MP5512 Portable MP3 Player (2-in-1 USB DISK/MP3) * PR: usb/80487 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "Generic*", "MUSIC DISK", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "Generic*", "MUSIC DISK", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -528,23 +544,24 @@ * PR: usb/75970 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "SanDisk" , "Micro Cruzer", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * TOSHIBA TransMemory USB sticks * PR: kern/94660 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "TOSHIBA", "TransMemory", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "TOSHIBA", "TransMemory", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * PNY USB Flash keys * PR: usb/75578, usb/72344, usb/65436 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "*" , "USB DISK*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "*" , "USB DISK*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -552,39 +569,40 @@ * PR: usb/94647 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Generic*", "STORAGE DEVICE*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Rekam Digital CAMERA * PR: usb/98713 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "CAMERA*", "4MP-9J6*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "CAMERA*", "4MP-9J6*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * iRiver H10 MP3 player * PR: usb/102547 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "iriver", "H10*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "iriver", "H10*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * iRiver U10 MP3 player * PR: usb/92306 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "iriver", "U10*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "iriver", "U10*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * X-Micro Flash Disk * PR: usb/96901 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "X-Micro", "Flash Disk", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "X-Micro", "Flash Disk", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -592,15 +610,16 @@ * PR: usb/96546 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "EM732X", "MP3 Player*", - "1.00"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "1.00"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Denver MP3 player * PR: usb/107101 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "DENVER", "MP3 PLAYER", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "DENVER", "MP3 PLAYER", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -608,15 +627,15 @@ * PR: usb/68412 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "PHILIPS", "Key*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE | DA_Q_NO_PREVENT + { .flags = DA_Q_NO_SYNC_CACHE | DA_Q_NO_PREVENT } }, { /* * JNC MP3 Player * PR: usb/94439 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "JNC*" , "MP3 Player*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "JNC*" , "MP3 Player*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -624,7 +643,7 @@ * PR: usb/108427 */ {T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "MP0402H", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -632,43 +651,43 @@ * PR: usb/108810 */ {T_DIRECT, SIP_MEDIA_FIXED, "GS-Magic", "stor*", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * JoyFly 128mb USB Flash Drive * PR: 96133 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB 2.0", "Flash Disk*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB 2.0", "Flash Disk*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * ChipsBnk usb stick * PR: 103702 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "ChipsBnk", "USB*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "ChipsBnk", "USB*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Storcase (Kingston) InfoStation IFS FC2/SATA-R 201A * PR: 129858 */ - {T_DIRECT, SIP_MEDIA_FIXED, "IFS", "FC2/SATA-R*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_FIXED, "IFS", "FC2/SATA-R*", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Samsung YP-U3 mp3-player * PR: 125398 */ - {T_DIRECT, SIP_MEDIA_REMOVABLE, "Samsung", "YP-U3", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "Samsung", "YP-U3", "*"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { - {T_DIRECT, SIP_MEDIA_REMOVABLE, "Netac", "OnlyDisk*", - "2000"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + {T_DIRECT, SIP_MEDIA_REMOVABLE, "Netac", "OnlyDisk*", "2000"}, + { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -676,253 +695,253 @@ * PR: usb/137035 */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "Sony", "Sony DSC", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE | DA_Q_NO_PREVENT + { .flags = DA_Q_NO_SYNC_CACHE | DA_Q_NO_PREVENT } }, { {T_DIRECT, SIP_MEDIA_REMOVABLE, "Kingston", "DataTraveler G3", - "1.00"}, /*quirks*/ DA_Q_NO_PREVENT + "1.00"}, { .flags = DA_Q_NO_PREVENT } }, { /* At least several Transcent USB sticks lie on RC16. */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "JetFlash", "Transcend*", - "*"}, /*quirks*/ DA_Q_NO_RC16 + "*"}, { .flags = DA_Q_NO_RC16 } }, /* ATA/SATA devices over SAS/USB/... */ { /* Hitachi Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "Hitachi", "H??????????E3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "SAMSUNG HD155UI*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "HD155UI*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "SAMSUNG HD204UI*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "HD204UI*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST????DL*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST????DL", "*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST???DM*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST???DM*", "*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST????DM*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST????DM", "*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9500423AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST950042", "3AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9500424AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST950042", "4AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9640423AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST964042", "3AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9640424AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST964042", "4AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9750420AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST975042", "0AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9750422AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST975042", "2AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST9750423AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST975042", "3AS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Thin Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "ST???LT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* Seagate Momentus Thin Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ST???LT*", "*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD????RS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "??RS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD????RX*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "??RX*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD??????RS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "????RS*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD??????RX*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "????RX*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD???PKT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "?PKT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD?????PKT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "???PKT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD???PVT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "?PVT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "WDC WD?????PVT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "WDC WD??", "???PVT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* * Olympus FE-210 camera */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "OLYMPUS", "FE210*", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * LG UP3S MP3 player */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "LG", "UP3S", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, { .flags = DA_Q_NO_SYNC_CACHE } }, { /* * Laser MP3-2GA13 MP3 player */ {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB 2.0", "(HS) Flash Disk", - "*"}, /*quirks*/ DA_Q_NO_SYNC_CACHE + "*"}, { .flags = DA_Q_NO_SYNC_CACHE } }, { /* @@ -931,7 +950,7 @@ * PR: 121474 */ {T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "HM250JI", "*"}, - /*quirks*/ DA_Q_NO_SYNC_CACHE + { .flags = DA_Q_NO_SYNC_CACHE } }, /* SATA SSDs */ { @@ -940,7 +959,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "Corsair CSSD-F*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -948,7 +967,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "Corsair Force 3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -956,7 +975,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "Corsair Force GT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -964,7 +983,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "M4-CT???M4SSD2*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -972,7 +991,7 @@ * 4k optimised */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "C300-CTFDDAC???MAG*", - "*" }, /*quirks*/DA_Q_4K + "*" }, { .lbppbe = 3 } }, { /* @@ -980,7 +999,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "INTEL SSDSA2CW*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -988,7 +1007,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "INTEL SSDSC2CT*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -996,7 +1015,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "INTEL SSDSC2MH*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1004,7 +1023,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "INTEL SSDSC2BW*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1012,7 +1031,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "INTEL SSDSA2M*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1020,7 +1039,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "KINGSTON SE100S3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1028,7 +1047,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "KINGSTON SH103S3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1036,7 +1055,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "MARVELL SD88SA02*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1044,7 +1063,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY2*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1052,7 +1071,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-AGILITY3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1060,7 +1079,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "DENRSTE251M45*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1068,7 +1087,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ?VERTEX2*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1076,7 +1095,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX3*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1084,7 +1103,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX4*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1092,7 +1111,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "SAMSUNG SSD 830 Series*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1100,7 +1119,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "FTM??CT25H*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, { /* @@ -1108,8 +1127,13 @@ * 4k optimised */ { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "SG9XCS2D*", "*" }, - /*quirks*/DA_Q_4K + { .lbppbe = 3 } }, + { + /* InnoDisk SSD SATA Disk on Modules */ + {T_DIRECT, SIP_MEDIA_FIXED, "InnoLite", "SATADOM *", "*"}, + { .lbppbe = 4 } + } }; static disk_strategy_t dastrategy; @@ -1247,7 +1271,7 @@ error = ENXIO; if (error == 0 && (softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && - (softc->quirks & DA_Q_NO_PREVENT) == 0) + (softc->quirks.flags & DA_Q_NO_PREVENT) == 0) daprevent(periph, PR_PREVENT); if (error == 0) { @@ -1285,7 +1309,7 @@ ("daclose\n")); if ((softc->flags & DA_FLAG_DIRTY) != 0 && - (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0 && + (softc->quirks.flags & DA_Q_NO_SYNC_CACHE) == 0 && (softc->flags & DA_FLAG_PACK_INVALID) == 0) { union ccb *ccb; @@ -1310,7 +1334,7 @@ } if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0) { - if ((softc->quirks & DA_Q_NO_PREVENT) == 0) + if ((softc->quirks.flags & DA_Q_NO_PREVENT) == 0) daprevent(periph, PR_ALLOW); /* * If we've got removeable media, mark the blocksize as @@ -1456,7 +1480,7 @@ /* * Sync the disk cache contents to the physical media. */ - if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { + if ((softc->quirks.flags & DA_Q_NO_SYNC_CACHE) == 0) { xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); csio.ccb_h.ccb_state = DA_CCB_DUMP; @@ -2044,10 +2068,11 @@ sizeof(da_quirk_table)/sizeof(*da_quirk_table), sizeof(*da_quirk_table), scsi_inquiry_match); + /* Structure copy. */ if (match != NULL) - softc->quirks = ((struct da_quirk_entry *)match)->quirks; + softc->quirks = ((struct da_quirk_entry *)match)->quirk_data; else - softc->quirks = DA_Q_NONE; + softc->quirks = da_no_quirks_data; /* Check if the SIM does not want 6 byte commands */ bzero(&cpi, sizeof(cpi)); @@ -2055,7 +2080,7 @@ cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); if (cpi.ccb_h.status == CAM_REQ_CMP && (cpi.hba_misc & PIM_NO_6_BYTE)) - softc->quirks |= DA_Q_NO_6_BYTE; + softc->quirks.flags |= DA_Q_NO_6_BYTE; TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph); @@ -2079,7 +2104,8 @@ /* * RBC devices don't have to support READ(6), only READ(10). */ - if (softc->quirks & DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) == T_RBC) + if (softc->quirks.flags & DA_Q_NO_6_BYTE + || SID_TYPE(&cgd->inq_data) == T_RBC) softc->minimum_cmd_size = 10; else softc->minimum_cmd_size = 6; @@ -2107,7 +2133,7 @@ /* Predict whether device may support READ CAPACITY(16). */ if (SID_ANSI_REV(&cgd->inq_data) >= SCSI_REV_SPC3 && - (softc->quirks & DA_Q_NO_RC16) == 0) { + (softc->quirks.flags & DA_Q_NO_RC16) == 0) { softc->flags |= DA_FLAG_CAN_RC16; softc->state = DA_STATE_PROBE_RC16; } @@ -2138,7 +2164,7 @@ softc->disk->d_maxsize = cpi.maxio; softc->disk->d_unit = periph->unit_number; softc->disk->d_flags = 0; - if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) + if ((softc->quirks.flags & DA_Q_NO_SYNC_CACHE) == 0) softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; if ((cpi.hba_misc & PIM_UNMAPPED) != 0) softc->disk->d_flags |= DISKFLAG_UNMAPPED_BIO; @@ -2828,22 +2854,22 @@ /* Detect unsupported PREVENT ALLOW MEDIUM REMOVAL. */ if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && (*cdb == PREVENT_ALLOW) && - (softc->quirks & DA_Q_NO_PREVENT) == 0) { + (softc->quirks.flags & DA_Q_NO_PREVENT) == 0) { if (bootverbose) xpt_print(ccb->ccb_h.path, "PREVENT ALLOW MEDIUM REMOVAL not supported.\n"); - softc->quirks |= DA_Q_NO_PREVENT; + softc->quirks.flags |= DA_Q_NO_PREVENT; return (0); } /* Detect unsupported SYNCHRONIZE CACHE(10). */ if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && (*cdb == SYNCHRONIZE_CACHE) && - (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { + (softc->quirks.flags & DA_Q_NO_SYNC_CACHE) == 0) { if (bootverbose) xpt_print(ccb->ccb_h.path, "SYNCHRONIZE CACHE(10) not supported.\n"); - softc->quirks |= DA_Q_NO_SYNC_CACHE; + softc->quirks.flags |= DA_Q_NO_SYNC_CACHE; softc->disk->d_flags &= ~DISKFLAG_CANFLUSHCACHE; return (0); } @@ -3018,7 +3044,7 @@ { struct scsi_read_capacity_data *rdcap; struct scsi_read_capacity_data_long *rcaplong; - char announce_buf[80]; + char announce_buf[DA_ANNOUNCE_BUF_LEN]; int lbp; lbp = 0; @@ -3206,7 +3232,8 @@ } } free(csio->data_ptr, M_SCSIDA); - if (announce_buf[0] != '\0' && ((softc->flags & DA_FLAG_PROBED) == 0)) { + if ((announce_buf[0] != '\0') + && ((softc->flags & DA_FLAG_PROBED) == 0)) { /* * Create our sysctl variables, now that we know * we have successfully attached. @@ -3216,7 +3243,7 @@ taskqueue_enqueue(taskqueue_thread, &softc->sysctl_task); xpt_announce_periph(periph, announce_buf); - xpt_announce_quirks(periph, softc->quirks, + xpt_announce_quirks(periph, softc->quirks.flags, DA_Q_BIT_STRING); } else { xpt_print(periph->path, "fatal error, " @@ -3639,6 +3666,12 @@ softc = (struct da_softc *)periph->softc; + if (softc->quirks.lbppbe != 0) + lbppbe = softc->quirks.lbppbe; + + if (softc->quirks.lalba != 0) + lalba = softc->quirks.lalba; + dp = &softc->params; dp->secsize = block_len; dp->sectors = maxsector + 1; @@ -3655,13 +3688,11 @@ dp->stripesize = block_len << lbppbe; dp->stripeoffset = (dp->stripesize - block_len * lalba) % dp->stripesize; - } else if (softc->quirks & DA_Q_4K) { - dp->stripesize = 4096; - dp->stripeoffset = 0; } else { dp->stripesize = 0; dp->stripeoffset = 0; } + /* * Have the controller provide us with a geometry * for this disk. The only time the geometry @@ -3793,7 +3824,7 @@ * if the drive is capable of it.. */ if (((softc->flags & DA_FLAG_OPEN) == 0) - || (softc->quirks & DA_Q_NO_SYNC_CACHE)) { + || (softc->quirks.flags & DA_Q_NO_SYNC_CACHE)) { cam_periph_unlock(periph); continue; } Index: sys/cam/ata/ata_da.c =================================================================== --- sys/cam/ata/ata_da.c (revision 254415) +++ sys/cam/ata/ata_da.c (working copy) @@ -92,8 +92,7 @@ typedef enum { ADA_Q_NONE = 0x00, - ADA_Q_4K = 0x01, -} ada_quirks; +} ada_quirk_flags; #define ADA_Q_BIT_STRING \ "\020" \ @@ -129,12 +128,18 @@ struct bio *bps[TRIM_MAX_BIOS]; }; +struct ada_quirk_data { + ada_quirk_flags flags; + u_int stripesize; + u_int stripeoffset; +}; + struct ada_softc { struct bio_queue_head bio_queue; struct bio_queue_head trim_queue; ada_state state; ada_flags flags; - ada_quirks quirks; + struct ada_quirk_data quirks; int sort_io_queue; int ordered_tag_count; int outstanding_cmds; @@ -159,7 +164,7 @@ struct ada_quirk_entry { struct scsi_inquiry_pattern inq_pat; - ada_quirks quirks; + struct ada_quirk_data quirk_data; }; static struct ada_quirk_entry ada_quirk_table[] = @@ -167,112 +172,112 @@ { /* Hitachi Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "Hitachi H??????????E3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG HD155UI*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Samsung Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG HD204UI*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Barracuda Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST????DL*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Barracuda Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST???DM*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Barracuda Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST????DM*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9500423AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9500424AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9640423AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9640424AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9750420AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9750422AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9750423AS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* Seagate Momentus Thin Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST???LT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RX*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????RS*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Caviar Green Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????RX*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD???PKT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Scorpio Black Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD?????PKT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD???PVT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* WDC Scorpio Blue Advanced Format (4k) drives */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD?????PVT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, /* SSDs */ { @@ -281,7 +286,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "Corsair CSSD-F*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -289,7 +294,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "Corsair Force 3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -297,7 +302,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "Corsair Force GT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -305,23 +310,31 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "M4-CT???M4SSD2*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* * Crucial RealSSD C300 SSDs * 4k optimised */ - { T_DIRECT, SIP_MEDIA_FIXED, "*", "C300-CTFDDAC???MAG*", - "*" }, /*quirks*/ADA_Q_4K + { T_DIRECT, SIP_MEDIA_FIXED, "*", "C300-CTFDDAC???MAG*", "*" }, + { .stripesize = 4096 } }, { /* + * InnoLite SATADOM + * 8K optimised + * Source: Edwin_Lam@innodisk.com + */ + { T_DIRECT, SIP_MEDIA_FIXED, "*", "InnoLite SATADOM *", "*"}, + { .stripesize = 8192 } + }, + { + /* * Intel 320 Series SSDs * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "INTEL SSDSA2CW*", "*" }, - /*quirks*/ADA_Q_4K }, { /* @@ -329,7 +342,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "INTEL SSDSC2CT*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -337,7 +350,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "INTEL SSDSC2MH*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -345,7 +358,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "INTEL SSDSC2BW*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -353,7 +366,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "INTEL SSDSA2M*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -361,7 +374,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "KINGSTON SE100S3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -369,7 +382,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "KINGSTON SH103S3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -377,7 +390,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "MARVELL SD88SA02*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -385,7 +398,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY2*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -393,7 +406,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -401,7 +414,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "DENRSTE251M45*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -409,7 +422,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ?VERTEX2*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -417,7 +430,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-VERTEX3*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -425,7 +438,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-VERTEX4*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -433,7 +446,7 @@ * 4k optimised */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG SSD 830 Series*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -441,7 +454,7 @@ * 4k optimised & trim only works in 4k requests + 4k aligned */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "FTM??CT25H*", "*" }, - /*quirks*/ADA_Q_4K + { .stripesize = 4096 } }, { /* @@ -449,7 +462,6 @@ * 4k optimised */ { T_DIRECT, SIP_MEDIA_FIXED, "*", "SG9XCS2D*", "*" }, - /*quirks*/ADA_Q_4K }, { /* Default */ @@ -457,7 +469,7 @@ T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED, /*vendor*/"*", /*product*/"*", /*revision*/"*" }, - /*quirks*/0 + {} }, }; @@ -1135,9 +1147,10 @@ struct ccb_getdev *cgd; char announce_buf[80], buf1[32]; struct disk_params *dp; + struct ada_quirk_data quirks; caddr_t match; u_int maxio; - int legacy_id, quirks; + int legacy_id; cgd = (struct ccb_getdev *)arg; if (cgd == NULL) { @@ -1195,9 +1208,12 @@ sizeof(ada_quirk_table)/sizeof(*ada_quirk_table), sizeof(*ada_quirk_table), ata_identify_match); if (match != NULL) - softc->quirks = ((struct ada_quirk_entry *)match)->quirks; - else - softc->quirks = ADA_Q_NONE; + softc->quirks = ((struct ada_quirk_entry *)match)->quirk_data; + else { + softc->quirks.flags = ADA_Q_NONE; + softc->quirks.stripesize = 0; + softc->quirks.stripeoffset = 0; + } bzero(&cpi, sizeof(cpi)); xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NONE); @@ -1211,10 +1227,7 @@ */ (void)cam_periph_hold(periph, PRIBIO); cam_periph_unlock(periph); - snprintf(announce_buf, sizeof(announce_buf), - "kern.cam.ada.%d.quirks", periph->unit_number); quirks = softc->quirks; - TUNABLE_INT_FETCH(announce_buf, &quirks); softc->quirks = quirks; softc->read_ahead = -1; snprintf(announce_buf, sizeof(announce_buf), @@ -1291,9 +1304,9 @@ softc->disk->d_stripeoffset = (softc->disk->d_stripesize - ata_logical_sector_offset(&cgd->ident_data)) % softc->disk->d_stripesize; - } else if (softc->quirks & ADA_Q_4K) { - softc->disk->d_stripesize = 4096; - softc->disk->d_stripeoffset = 0; + } else if (softc->quirks.stripesize > 0) { + softc->disk->d_stripesize = softc->quirks.stripesize; + softc->disk->d_stripeoffset = softc->quirks.stripeoffset; } softc->disk->d_fwsectors = softc->params.secs_per_track; softc->disk->d_fwheads = softc->params.heads; @@ -1339,7 +1352,6 @@ dp->secsize, dp->heads, dp->secs_per_track, dp->cylinders); xpt_announce_periph(periph, announce_buf); - xpt_announce_quirks(periph, softc->quirks, ADA_Q_BIT_STRING); if (legacy_id >= 0) printf("%s%d: Previously was known as ad%d\n", periph->periph_name, periph->unit_number, legacy_id);