Blame view

drivers/ata/sata_promise.h 3.06 KB
c82ee6d3b   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
  /*
   *  sata_promise.h - Promise SATA common definitions and inline funcs
   *
   *  Copyright 2003-2004 Red Hat, Inc.
   *
af36d7f0d   Jeff Garzik   [libata] license ...
7
   *  libata documentation is available via 'make {ps|pdf}docs',
19285f3c4   Mauro Carvalho Chehab   ata: update refer...
8
   *  as Documentation/driver-api/libata.rst
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   */
  
  #ifndef __SATA_PROMISE_H__
  #define __SATA_PROMISE_H__
  
  #include <linux/ata.h>
  
  enum pdc_packet_bits {
  	PDC_PKT_READ		= (1 << 2),
  	PDC_PKT_NODATA		= (1 << 3),
  
  	PDC_PKT_SIZEMASK	= (1 << 7) | (1 << 6) | (1 << 5),
  	PDC_PKT_CLEAR_BSY	= (1 << 4),
  	PDC_PKT_WAIT_DRDY	= (1 << 3) | (1 << 4),
  	PDC_LAST_REG		= (1 << 3),
  
  	PDC_REG_DEVCTL		= (1 << 3) | (1 << 2) | (1 << 1),
  };
  
  static inline unsigned int pdc_pkt_header(struct ata_taskfile *tf,
  					  dma_addr_t sg_table,
  					  unsigned int devno, u8 *buf)
  {
  	u8 dev_reg;
4ca4e4396   Al Viro   libata annotation...
33
  	__le32 *buf32 = (__le32 *) buf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  
  	/* set control bits (byte 0), zero delay seq id (byte 3),
  	 * and seq id (byte 2)
  	 */
  	switch (tf->protocol) {
  	case ATA_PROT_DMA:
  		if (!(tf->flags & ATA_TFLAG_WRITE))
  			buf32[0] = cpu_to_le32(PDC_PKT_READ);
  		else
  			buf32[0] = 0;
  		break;
  
  	case ATA_PROT_NODATA:
  		buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
  		break;
  
  	default:
  		BUG();
  		break;
  	}
  
  	buf32[1] = cpu_to_le32(sg_table);	/* S/G table addr */
  	buf32[2] = 0;				/* no next-packet */
  
  	if (devno == 0)
  		dev_reg = ATA_DEVICE_OBS;
  	else
  		dev_reg = ATA_DEVICE_OBS | ATA_DEV1;
  
  	/* select device */
  	buf[12] = (1 << 5) | PDC_PKT_CLEAR_BSY | ATA_REG_DEVICE;
  	buf[13] = dev_reg;
  
  	/* device control register */
  	buf[14] = (1 << 5) | PDC_REG_DEVCTL;
  	buf[15] = tf->ctl;
  
  	return 16; 	/* offset of next byte */
  }
  
  static inline unsigned int pdc_pkt_footer(struct ata_taskfile *tf, u8 *buf,
  				  unsigned int i)
  {
  	if (tf->flags & ATA_TFLAG_DEVICE) {
  		buf[i++] = (1 << 5) | ATA_REG_DEVICE;
  		buf[i++] = tf->device;
  	}
  
  	/* and finally the command itself; also includes end-of-pkt marker */
  	buf[i++] = (1 << 5) | PDC_LAST_REG | ATA_REG_CMD;
  	buf[i++] = tf->command;
  
  	return i;
  }
  
  static inline unsigned int pdc_prep_lba28(struct ata_taskfile *tf, u8 *buf, unsigned int i)
  {
  	/* the "(1 << 5)" should be read "(count << 5)" */
  
  	/* ATA command block registers */
  	buf[i++] = (1 << 5) | ATA_REG_FEATURE;
  	buf[i++] = tf->feature;
  
  	buf[i++] = (1 << 5) | ATA_REG_NSECT;
  	buf[i++] = tf->nsect;
  
  	buf[i++] = (1 << 5) | ATA_REG_LBAL;
  	buf[i++] = tf->lbal;
  
  	buf[i++] = (1 << 5) | ATA_REG_LBAM;
  	buf[i++] = tf->lbam;
  
  	buf[i++] = (1 << 5) | ATA_REG_LBAH;
  	buf[i++] = tf->lbah;
  
  	return i;
  }
  
  static inline unsigned int pdc_prep_lba48(struct ata_taskfile *tf, u8 *buf, unsigned int i)
  {
  	/* the "(2 << 5)" should be read "(count << 5)" */
  
  	/* ATA command block registers */
  	buf[i++] = (2 << 5) | ATA_REG_FEATURE;
  	buf[i++] = tf->hob_feature;
  	buf[i++] = tf->feature;
  
  	buf[i++] = (2 << 5) | ATA_REG_NSECT;
  	buf[i++] = tf->hob_nsect;
  	buf[i++] = tf->nsect;
  
  	buf[i++] = (2 << 5) | ATA_REG_LBAL;
  	buf[i++] = tf->hob_lbal;
  	buf[i++] = tf->lbal;
  
  	buf[i++] = (2 << 5) | ATA_REG_LBAM;
  	buf[i++] = tf->hob_lbam;
  	buf[i++] = tf->lbam;
  
  	buf[i++] = (2 << 5) | ATA_REG_LBAH;
  	buf[i++] = tf->hob_lbah;
  	buf[i++] = tf->lbah;
  
  	return i;
  }
  
  
  #endif /* __SATA_PROMISE_H__ */