Merge branch 'for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
Pull libata updates from Tejun Heo:
"libata saw quite a bit of activities in this cycle:
- SMR drive support still being worked on
- bug fixes and improvements to misc SCSI command emulation
- some low level driver updates"
* 'for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata: (39 commits)
libata-scsi: better style in ata_msense_*()
AHCI: Clear GHC.IS to prevent unexpectly asserting INTx
ata: sata_dwc_460ex: remove redundant dev_err call
ata: define ATA_PROT_* in terms of ATA_PROT_FLAG_*
libata: remove ATA_PROT_FLAG_DATA
libata: remove ata_is_nodata
ata: make lba_{28,48}_ok() use ATA_MAX_SECTORS{,_LBA48}
libata-scsi: minor cleanup for ata_scsi_zbc_out_xlat
libata-scsi: Fix ZBC management out command translation
libata-scsi: Fix translation of REPORT ZONES command
ata: Handle ATA NCQ NO-DATA commands correctly
libata-eh: decode all taskfile protocols
ata: fixup ATA_PROT_NODATA
libsas: use ata_is_ncq() and ata_has_dma() accessors
libata: use ata_is_ncq() accessors
libata: return boolean values from ata_is_*
libata-scsi: avoid repeated calculation of number of TRIM ranges
libata-scsi: reject WRITE SAME (16) with n_block that exceeds limit
libata-scsi: rename ata_msense_ctl_mode() to ata_msense_control()
libata-scsi: fix D_SENSE bit relection in control mode page
...
This commit is contained in:
commit
75a442efb1
24 changed files with 314 additions and 153 deletions
|
|
@ -46,8 +46,9 @@ enum {
|
|||
ATA_MAX_SECTORS_128 = 128,
|
||||
ATA_MAX_SECTORS = 256,
|
||||
ATA_MAX_SECTORS_1024 = 1024,
|
||||
ATA_MAX_SECTORS_LBA48 = 65535,/* TODO: 65536? */
|
||||
ATA_MAX_SECTORS_LBA48 = 65535,/* avoid count to be 0000h */
|
||||
ATA_MAX_SECTORS_TAPE = 65535,
|
||||
ATA_MAX_TRIM_RNUM = 64, /* 512-byte payload / (6-byte LBA + 2-byte range per entry) */
|
||||
|
||||
ATA_ID_WORDS = 256,
|
||||
ATA_ID_CONFIG = 0,
|
||||
|
|
@ -409,6 +410,9 @@ enum {
|
|||
SETFEATURES_WC_ON = 0x02, /* Enable write cache */
|
||||
SETFEATURES_WC_OFF = 0x82, /* Disable write cache */
|
||||
|
||||
SETFEATURES_RA_ON = 0xaa, /* Enable read look-ahead */
|
||||
SETFEATURES_RA_OFF = 0x55, /* Disable read look-ahead */
|
||||
|
||||
/* Enable/Disable Automatic Acoustic Management */
|
||||
SETFEATURES_AAM_ON = 0x42,
|
||||
SETFEATURES_AAM_OFF = 0xC2,
|
||||
|
|
@ -519,16 +523,23 @@ enum {
|
|||
SERR_DEV_XCHG = (1 << 26), /* device exchanged */
|
||||
};
|
||||
|
||||
enum ata_tf_protocols {
|
||||
/* ATA taskfile protocols */
|
||||
ATA_PROT_UNKNOWN, /* unknown/invalid */
|
||||
ATA_PROT_NODATA, /* no data */
|
||||
ATA_PROT_PIO, /* PIO data xfer */
|
||||
ATA_PROT_DMA, /* DMA */
|
||||
ATA_PROT_NCQ, /* NCQ */
|
||||
ATAPI_PROT_NODATA, /* packet command, no data */
|
||||
ATAPI_PROT_PIO, /* packet command, PIO data xfer*/
|
||||
ATAPI_PROT_DMA, /* packet command with special DMA sauce */
|
||||
enum ata_prot_flags {
|
||||
/* protocol flags */
|
||||
ATA_PROT_FLAG_PIO = (1 << 0), /* is PIO */
|
||||
ATA_PROT_FLAG_DMA = (1 << 1), /* is DMA */
|
||||
ATA_PROT_FLAG_NCQ = (1 << 2), /* is NCQ */
|
||||
ATA_PROT_FLAG_ATAPI = (1 << 3), /* is ATAPI */
|
||||
|
||||
/* taskfile protocols */
|
||||
ATA_PROT_UNKNOWN = (u8)-1,
|
||||
ATA_PROT_NODATA = 0,
|
||||
ATA_PROT_PIO = ATA_PROT_FLAG_PIO,
|
||||
ATA_PROT_DMA = ATA_PROT_FLAG_DMA,
|
||||
ATA_PROT_NCQ_NODATA = ATA_PROT_FLAG_NCQ,
|
||||
ATA_PROT_NCQ = ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ,
|
||||
ATAPI_PROT_NODATA = ATA_PROT_FLAG_ATAPI,
|
||||
ATAPI_PROT_PIO = ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO,
|
||||
ATAPI_PROT_DMA = ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_DMA,
|
||||
};
|
||||
|
||||
enum ata_ioctls {
|
||||
|
|
@ -1066,12 +1077,12 @@ static inline void ata_id_to_hd_driveid(u16 *id)
|
|||
* TO NV CACHE PINNED SET.
|
||||
*/
|
||||
static inline unsigned ata_set_lba_range_entries(void *_buffer,
|
||||
unsigned buf_size, u64 sector, unsigned long count)
|
||||
unsigned num, u64 sector, unsigned long count)
|
||||
{
|
||||
__le64 *buffer = _buffer;
|
||||
unsigned i = 0, used_bytes;
|
||||
|
||||
while (i < buf_size / 8 ) { /* 6-byte LBA + 2-byte range per entry */
|
||||
while (i < num) {
|
||||
u64 entry = sector |
|
||||
((u64)(count > 0xffff ? 0xffff : count) << 48);
|
||||
buffer[i++] = __cpu_to_le64(entry);
|
||||
|
|
@ -1095,13 +1106,13 @@ static inline bool ata_ok(u8 status)
|
|||
static inline bool lba_28_ok(u64 block, u32 n_block)
|
||||
{
|
||||
/* check the ending block number: must be LESS THAN 0x0fffffff */
|
||||
return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256);
|
||||
return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= ATA_MAX_SECTORS);
|
||||
}
|
||||
|
||||
static inline bool lba_48_ok(u64 block, u32 n_block)
|
||||
{
|
||||
/* check the ending block number */
|
||||
return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= 65536);
|
||||
return ((block + n_block - 1) < ((u64)1 << 48)) && (n_block <= ATA_MAX_SECTORS_LBA48);
|
||||
}
|
||||
|
||||
#define sata_pmp_gscr_vendor(gscr) ((gscr)[SATA_PMP_GSCR_PROD_ID] & 0xffff)
|
||||
|
|
|
|||
|
|
@ -146,13 +146,6 @@ enum {
|
|||
ATA_TFLAG_FUA = (1 << 5), /* enable FUA */
|
||||
ATA_TFLAG_POLLING = (1 << 6), /* set nIEN to 1 and use polling */
|
||||
|
||||
/* protocol flags */
|
||||
ATA_PROT_FLAG_PIO = (1 << 0), /* is PIO */
|
||||
ATA_PROT_FLAG_DMA = (1 << 1), /* is DMA */
|
||||
ATA_PROT_FLAG_DATA = ATA_PROT_FLAG_PIO | ATA_PROT_FLAG_DMA,
|
||||
ATA_PROT_FLAG_NCQ = (1 << 2), /* is NCQ */
|
||||
ATA_PROT_FLAG_ATAPI = (1 << 3), /* is ATAPI */
|
||||
|
||||
/* struct ata_device stuff */
|
||||
ATA_DFLAG_LBA = (1 << 0), /* device supports LBA */
|
||||
ATA_DFLAG_LBA48 = (1 << 1), /* device supports LBA48 */
|
||||
|
|
@ -1039,58 +1032,29 @@ extern const unsigned long sata_deb_timing_long[];
|
|||
extern struct ata_port_operations ata_dummy_port_ops;
|
||||
extern const struct ata_port_info ata_dummy_port_info;
|
||||
|
||||
/*
|
||||
* protocol tests
|
||||
*/
|
||||
static inline unsigned int ata_prot_flags(u8 prot)
|
||||
static inline bool ata_is_atapi(u8 prot)
|
||||
{
|
||||
switch (prot) {
|
||||
case ATA_PROT_NODATA:
|
||||
return 0;
|
||||
case ATA_PROT_PIO:
|
||||
return ATA_PROT_FLAG_PIO;
|
||||
case ATA_PROT_DMA:
|
||||
return ATA_PROT_FLAG_DMA;
|
||||
case ATA_PROT_NCQ:
|
||||
return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ;
|
||||
case ATAPI_PROT_NODATA:
|
||||
return ATA_PROT_FLAG_ATAPI;
|
||||
case ATAPI_PROT_PIO:
|
||||
return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO;
|
||||
case ATAPI_PROT_DMA:
|
||||
return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_DMA;
|
||||
}
|
||||
return 0;
|
||||
return prot & ATA_PROT_FLAG_ATAPI;
|
||||
}
|
||||
|
||||
static inline int ata_is_atapi(u8 prot)
|
||||
static inline bool ata_is_pio(u8 prot)
|
||||
{
|
||||
return ata_prot_flags(prot) & ATA_PROT_FLAG_ATAPI;
|
||||
return prot & ATA_PROT_FLAG_PIO;
|
||||
}
|
||||
|
||||
static inline int ata_is_nodata(u8 prot)
|
||||
static inline bool ata_is_dma(u8 prot)
|
||||
{
|
||||
return !(ata_prot_flags(prot) & ATA_PROT_FLAG_DATA);
|
||||
return prot & ATA_PROT_FLAG_DMA;
|
||||
}
|
||||
|
||||
static inline int ata_is_pio(u8 prot)
|
||||
static inline bool ata_is_ncq(u8 prot)
|
||||
{
|
||||
return ata_prot_flags(prot) & ATA_PROT_FLAG_PIO;
|
||||
return prot & ATA_PROT_FLAG_NCQ;
|
||||
}
|
||||
|
||||
static inline int ata_is_dma(u8 prot)
|
||||
static inline bool ata_is_data(u8 prot)
|
||||
{
|
||||
return ata_prot_flags(prot) & ATA_PROT_FLAG_DMA;
|
||||
}
|
||||
|
||||
static inline int ata_is_ncq(u8 prot)
|
||||
{
|
||||
return ata_prot_flags(prot) & ATA_PROT_FLAG_NCQ;
|
||||
}
|
||||
|
||||
static inline int ata_is_data(u8 prot)
|
||||
{
|
||||
return ata_prot_flags(prot) & ATA_PROT_FLAG_DATA;
|
||||
return prot & (ATA_PROT_FLAG_PIO | ATA_PROT_FLAG_DMA);
|
||||
}
|
||||
|
||||
static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
||||
|
|
@ -1407,7 +1371,7 @@ static inline bool sata_pmp_attached(struct ata_port *ap)
|
|||
return ap->nr_pmp_links != 0;
|
||||
}
|
||||
|
||||
static inline int ata_is_host_link(const struct ata_link *link)
|
||||
static inline bool ata_is_host_link(const struct ata_link *link)
|
||||
{
|
||||
return link == &link->ap->link || link == link->ap->slave_link;
|
||||
}
|
||||
|
|
@ -1422,7 +1386,7 @@ static inline bool sata_pmp_attached(struct ata_port *ap)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline int ata_is_host_link(const struct ata_link *link)
|
||||
static inline bool ata_is_host_link(const struct ata_link *link)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue