| .. | .. | 
|---|
|  | 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|---|
| 1 | 2 |  | 
|---|
| 2 | 3 | /* | 
|---|
| 3 | 4 | *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved. | 
|---|
| 4 | 5 | *  Copyright 2003-2004 Jeff Garzik | 
|---|
| 5 | 6 | * | 
|---|
| 6 |  | - * | 
|---|
| 7 |  | - *  This program is free software; you can redistribute it and/or modify | 
|---|
| 8 |  | - *  it under the terms of the GNU General Public License as published by | 
|---|
| 9 |  | - *  the Free Software Foundation; either version 2, or (at your option) | 
|---|
| 10 |  | - *  any later version. | 
|---|
| 11 |  | - * | 
|---|
| 12 |  | - *  This program is distributed in the hope that it will be useful, | 
|---|
| 13 |  | - *  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 14 |  | - *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 15 |  | - *  GNU General Public License for more details. | 
|---|
| 16 |  | - * | 
|---|
| 17 |  | - *  You should have received a copy of the GNU General Public License | 
|---|
| 18 |  | - *  along with this program; see the file COPYING.  If not, write to | 
|---|
| 19 |  | - *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 
|---|
| 20 |  | - * | 
|---|
| 21 |  | - * | 
|---|
| 22 | 7 | *  libata documentation is available via 'make {ps|pdf}docs', | 
|---|
| 23 | 8 | *  as Documentation/driver-api/libata.rst | 
|---|
| 24 | 9 | * | 
|---|
| 25 | 10 | *  Hardware documentation available from http://www.t13.org/ | 
|---|
| 26 |  | - * | 
|---|
| 27 | 11 | */ | 
|---|
| 28 | 12 |  | 
|---|
| 29 | 13 | #ifndef __LINUX_ATA_H__ | 
|---|
| .. | .. | 
|---|
| 581 | 565 | ((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ | 
|---|
| 582 | 566 | ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ | 
|---|
| 583 | 567 | ((id)[ATA_ID_FEATURE_SUPP] & (1 << 2))) | 
|---|
|  | 568 | +#define ata_id_has_devslp(id)	\ | 
|---|
|  | 569 | +	((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ | 
|---|
|  | 570 | +	  ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ | 
|---|
|  | 571 | +	 ((id)[ATA_ID_FEATURE_SUPP] & (1 << 8))) | 
|---|
|  | 572 | +#define ata_id_has_ncq_autosense(id) \ | 
|---|
|  | 573 | +	((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ | 
|---|
|  | 574 | +	  ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ | 
|---|
|  | 575 | +	 ((id)[ATA_ID_FEATURE_SUPP] & (1 << 7))) | 
|---|
|  | 576 | +#define ata_id_has_dipm(id)	\ | 
|---|
|  | 577 | +	((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ | 
|---|
|  | 578 | +	  ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ | 
|---|
|  | 579 | +	 ((id)[ATA_ID_FEATURE_SUPP] & (1 << 3))) | 
|---|
| 584 | 580 | #define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10)) | 
|---|
| 585 | 581 | #define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11)) | 
|---|
| 586 | 582 | #define ata_id_u32(id,n)	\ | 
|---|
| .. | .. | 
|---|
| 593 | 589 |  | 
|---|
| 594 | 590 | #define ata_id_cdb_intr(id)	(((id)[ATA_ID_CONFIG] & 0x60) == 0x20) | 
|---|
| 595 | 591 | #define ata_id_has_da(id)	((id)[ATA_ID_SATA_CAPABILITY_2] & (1 << 4)) | 
|---|
| 596 |  | -#define ata_id_has_devslp(id)	((id)[ATA_ID_FEATURE_SUPP] & (1 << 8)) | 
|---|
| 597 |  | -#define ata_id_has_ncq_autosense(id) \ | 
|---|
| 598 |  | -				((id)[ATA_ID_FEATURE_SUPP] & (1 << 7)) | 
|---|
| 599 | 592 |  | 
|---|
| 600 | 593 | static inline bool ata_id_has_hipm(const u16 *id) | 
|---|
| 601 | 594 | { | 
|---|
| .. | .. | 
|---|
| 606 | 599 |  | 
|---|
| 607 | 600 | return val & (1 << 9); | 
|---|
| 608 | 601 | } | 
|---|
| 609 |  | - | 
|---|
| 610 |  | -static inline bool ata_id_has_dipm(const u16 *id) | 
|---|
| 611 |  | -{ | 
|---|
| 612 |  | -	u16 val = id[ATA_ID_FEATURE_SUPP]; | 
|---|
| 613 |  | - | 
|---|
| 614 |  | -	if (val == 0 || val == 0xffff) | 
|---|
| 615 |  | -		return false; | 
|---|
| 616 |  | - | 
|---|
| 617 |  | -	return val & (1 << 3); | 
|---|
| 618 |  | -} | 
|---|
| 619 |  | - | 
|---|
| 620 | 602 |  | 
|---|
| 621 | 603 | static inline bool ata_id_has_fua(const u16 *id) | 
|---|
| 622 | 604 | { | 
|---|
| .. | .. | 
|---|
| 786 | 768 |  | 
|---|
| 787 | 769 | static inline bool ata_id_has_sense_reporting(const u16 *id) | 
|---|
| 788 | 770 | { | 
|---|
| 789 |  | -	if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15))) | 
|---|
|  | 771 | +	if (!(id[ATA_ID_CFS_ENABLE_2] & BIT(15))) | 
|---|
| 790 | 772 | return false; | 
|---|
| 791 |  | -	return id[ATA_ID_COMMAND_SET_3] & (1 << 6); | 
|---|
|  | 773 | +	if ((id[ATA_ID_COMMAND_SET_3] & (BIT(15) | BIT(14))) != BIT(14)) | 
|---|
|  | 774 | +		return false; | 
|---|
|  | 775 | +	return id[ATA_ID_COMMAND_SET_3] & BIT(6); | 
|---|
| 792 | 776 | } | 
|---|
| 793 | 777 |  | 
|---|
| 794 | 778 | static inline bool ata_id_sense_reporting_enabled(const u16 *id) | 
|---|
| 795 | 779 | { | 
|---|
| 796 |  | -	if (!(id[ATA_ID_CFS_ENABLE_2] & (1 << 15))) | 
|---|
|  | 780 | +	if (!ata_id_has_sense_reporting(id)) | 
|---|
| 797 | 781 | return false; | 
|---|
| 798 |  | -	return id[ATA_ID_COMMAND_SET_4] & (1 << 6); | 
|---|
|  | 782 | +	/* ata_id_has_sense_reporting() == true, word 86 must have bit 15 set */ | 
|---|
|  | 783 | +	if ((id[ATA_ID_COMMAND_SET_4] & (BIT(15) | BIT(14))) != BIT(14)) | 
|---|
|  | 784 | +		return false; | 
|---|
|  | 785 | +	return id[ATA_ID_COMMAND_SET_4] & BIT(6); | 
|---|
| 799 | 786 | } | 
|---|
| 800 | 787 |  | 
|---|
| 801 | 788 | /** | 
|---|