Deleted Added
full compact
ichsmb.c (66703) ichsmb.c (69689)
1
2/*
3 * ichsmb.c
4 *
5 * Copyright (c) 2000 Whistle Communications, Inc.
6 * All rights reserved.
7 *
8 * Subject to the following obligations and disclaimer of warranty, use and

--- 22 unchanged lines hidden (view full) ---

31 * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
35 * OF SUCH DAMAGE.
36 *
37 * Author: Archie Cobbs <archie@freebsd.org>
38 *
1
2/*
3 * ichsmb.c
4 *
5 * Copyright (c) 2000 Whistle Communications, Inc.
6 * All rights reserved.
7 *
8 * Subject to the following obligations and disclaimer of warranty, use and

--- 22 unchanged lines hidden (view full) ---

31 * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
35 * OF SUCH DAMAGE.
36 *
37 * Author: Archie Cobbs <archie@freebsd.org>
38 *
39 * $FreeBSD: head/sys/dev/ichsmb/ichsmb.c 66703 2000-10-06 00:09:46Z archie $
39 * $FreeBSD: head/sys/dev/ichsmb/ichsmb.c 69689 2000-12-07 02:09:39Z archie $
40 */
41
42/*
43 * Support for the SMBus controller logical device which is part of the
44 * Intel 81801AA (ICH) and 81801AB (ICH0) I/O controller hub chips.
40 */
41
42/*
43 * Support for the SMBus controller logical device which is part of the
44 * Intel 81801AA (ICH) and 81801AB (ICH0) I/O controller hub chips.
45 *
46 * This driver assumes that the generic SMBus code will ensure that
47 * at most one process at a time calls into the SMBus methods below.
45 */
46
47#include <sys/param.h>
48#include <sys/systm.h>
49#include <sys/kernel.h>
50#include <sys/errno.h>
48 */
49
50#include <sys/param.h>
51#include <sys/systm.h>
52#include <sys/kernel.h>
53#include <sys/errno.h>
54#include <sys/mutex.h>
51#include <sys/syslog.h>
52#include <sys/bus.h>
53
54#include <machine/bus.h>
55#include <sys/rman.h>
56#include <machine/resource.h>
57
58#include <dev/smbus/smbconf.h>

--- 56 unchanged lines hidden (view full) ---

115
116 /* Clear interrupt conditions */
117 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_STA, 0xff);
118
119 /* Add "smbus" child */
120 if ((error = bus_generic_attach(dev)) != 0) {
121 log(LOG_ERR, "%s: failed to attach child: %d\n",
122 device_get_nameunit(dev), error);
55#include <sys/syslog.h>
56#include <sys/bus.h>
57
58#include <machine/bus.h>
59#include <sys/rman.h>
60#include <machine/resource.h>
61
62#include <dev/smbus/smbconf.h>

--- 56 unchanged lines hidden (view full) ---

119
120 /* Clear interrupt conditions */
121 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_STA, 0xff);
122
123 /* Add "smbus" child */
124 if ((error = bus_generic_attach(dev)) != 0) {
125 log(LOG_ERR, "%s: failed to attach child: %d\n",
126 device_get_nameunit(dev), error);
123 error = ENXIO;
127 return (ENXIO);
124 }
125
128 }
129
126 /* Done */
127 return (error);
130 /* Create mutex */
131 mtx_init(&sc->mutex, device_get_nameunit(dev), 0);
132 return (0);
128}
129
130/********************************************************************
131 SMBUS METHODS
132********************************************************************/
133
134int
135ichsmb_callback(device_t dev, int index, caddr_t data)

--- 14 unchanged lines hidden (view full) ---

150 return (smb_error);
151}
152
153int
154ichsmb_quick(device_t dev, u_char slave, int how)
155{
156 const sc_p sc = device_get_softc(dev);
157 int smb_error;
133}
134
135/********************************************************************
136 SMBUS METHODS
137********************************************************************/
138
139int
140ichsmb_callback(device_t dev, int index, caddr_t data)

--- 14 unchanged lines hidden (view full) ---

155 return (smb_error);
156}
157
158int
159ichsmb_quick(device_t dev, u_char slave, int how)
160{
161 const sc_p sc = device_get_softc(dev);
162 int smb_error;
158 int s;
159
160 DBG("slave=0x%02x how=%d\n", slave, how);
161 KASSERT(sc->ich_cmd == -1,
162 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
163 switch (how) {
164 case SMB_QREAD:
165 case SMB_QWRITE:
163
164 DBG("slave=0x%02x how=%d\n", slave, how);
165 KASSERT(sc->ich_cmd == -1,
166 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
167 switch (how) {
168 case SMB_QREAD:
169 case SMB_QWRITE:
166 s = splhigh();
170 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
167 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_QUICK;
168 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
169 (slave << 1) | (how == SMB_QREAD ?
170 ICH_XMIT_SLVA_READ : ICH_XMIT_SLVA_WRITE));
171 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
172 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
173 smb_error = ichsmb_wait(sc);
171 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_QUICK;
172 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
173 (slave << 1) | (how == SMB_QREAD ?
174 ICH_XMIT_SLVA_READ : ICH_XMIT_SLVA_WRITE));
175 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
176 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
177 smb_error = ichsmb_wait(sc);
174 splx(s);
178 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
175 break;
176 default:
177 smb_error = SMB_ENOTSUPP;
178 }
179 DBG("smb_error=%d\n", smb_error);
180 return (smb_error);
181}
182
183int
184ichsmb_sendb(device_t dev, u_char slave, char byte)
185{
186 const sc_p sc = device_get_softc(dev);
187 int smb_error;
179 break;
180 default:
181 smb_error = SMB_ENOTSUPP;
182 }
183 DBG("smb_error=%d\n", smb_error);
184 return (smb_error);
185}
186
187int
188ichsmb_sendb(device_t dev, u_char slave, char byte)
189{
190 const sc_p sc = device_get_softc(dev);
191 int smb_error;
188 int s;
189
190 DBG("slave=0x%02x byte=0x%02x\n", slave, (u_char)byte);
191 KASSERT(sc->ich_cmd == -1,
192 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
192
193 DBG("slave=0x%02x byte=0x%02x\n", slave, (u_char)byte);
194 KASSERT(sc->ich_cmd == -1,
195 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
193 s = splhigh();
196 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
194 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
195 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
196 (slave << 1) | ICH_XMIT_SLVA_WRITE);
197 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, byte);
198 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
199 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
200 smb_error = ichsmb_wait(sc);
197 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
198 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
199 (slave << 1) | ICH_XMIT_SLVA_WRITE);
200 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, byte);
201 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
202 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
203 smb_error = ichsmb_wait(sc);
201 splx(s);
204 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
202 DBG("smb_error=%d\n", smb_error);
203 return (smb_error);
204}
205
206int
207ichsmb_recvb(device_t dev, u_char slave, char *byte)
208{
209 const sc_p sc = device_get_softc(dev);
210 int smb_error;
205 DBG("smb_error=%d\n", smb_error);
206 return (smb_error);
207}
208
209int
210ichsmb_recvb(device_t dev, u_char slave, char *byte)
211{
212 const sc_p sc = device_get_softc(dev);
213 int smb_error;
211 int s;
212
213 DBG("slave=0x%02x\n", slave);
214 KASSERT(sc->ich_cmd == -1,
215 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
214
215 DBG("slave=0x%02x\n", slave);
216 KASSERT(sc->ich_cmd == -1,
217 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
216 s = splhigh();
218 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
217 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
218 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
219 (slave << 1) | ICH_XMIT_SLVA_READ);
220 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
221 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
222 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
223 *byte = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_D0);
219 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
220 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
221 (slave << 1) | ICH_XMIT_SLVA_READ);
222 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
223 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
224 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
225 *byte = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_D0);
224 splx(s);
226 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
225 DBG("smb_error=%d byte=0x%02x\n", smb_error, (u_char)*byte);
226 return (smb_error);
227}
228
229int
230ichsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
231{
232 const sc_p sc = device_get_softc(dev);
233 int smb_error;
227 DBG("smb_error=%d byte=0x%02x\n", smb_error, (u_char)*byte);
228 return (smb_error);
229}
230
231int
232ichsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
233{
234 const sc_p sc = device_get_softc(dev);
235 int smb_error;
234 int s;
235
236 DBG("slave=0x%02x cmd=0x%02x byte=0x%02x\n",
237 slave, (u_char)cmd, (u_char)byte);
238 KASSERT(sc->ich_cmd == -1,
239 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
236
237 DBG("slave=0x%02x cmd=0x%02x byte=0x%02x\n",
238 slave, (u_char)cmd, (u_char)byte);
239 KASSERT(sc->ich_cmd == -1,
240 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
240 s = splhigh();
241 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
241 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
242 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
243 (slave << 1) | ICH_XMIT_SLVA_WRITE);
244 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
245 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, byte);
246 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
247 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
248 smb_error = ichsmb_wait(sc);
242 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
243 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
244 (slave << 1) | ICH_XMIT_SLVA_WRITE);
245 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
246 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, byte);
247 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
248 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
249 smb_error = ichsmb_wait(sc);
249 splx(s);
250 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
250 DBG("smb_error=%d\n", smb_error);
251 return (smb_error);
252}
253
254int
255ichsmb_writew(device_t dev, u_char slave, char cmd, short word)
256{
257 const sc_p sc = device_get_softc(dev);
258 int smb_error;
251 DBG("smb_error=%d\n", smb_error);
252 return (smb_error);
253}
254
255int
256ichsmb_writew(device_t dev, u_char slave, char cmd, short word)
257{
258 const sc_p sc = device_get_softc(dev);
259 int smb_error;
259 int s;
260
261 DBG("slave=0x%02x cmd=0x%02x word=0x%04x\n",
262 slave, (u_char)cmd, (u_int16_t)word);
263 KASSERT(sc->ich_cmd == -1,
264 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
260
261 DBG("slave=0x%02x cmd=0x%02x word=0x%04x\n",
262 slave, (u_char)cmd, (u_int16_t)word);
263 KASSERT(sc->ich_cmd == -1,
264 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
265 s = splhigh();
265 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
266 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
267 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
268 (slave << 1) | ICH_XMIT_SLVA_WRITE);
269 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
270 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, word & 0xff);
271 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D1, word >> 8);
272 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
273 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
274 smb_error = ichsmb_wait(sc);
266 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
267 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
268 (slave << 1) | ICH_XMIT_SLVA_WRITE);
269 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
270 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, word & 0xff);
271 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D1, word >> 8);
272 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
273 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
274 smb_error = ichsmb_wait(sc);
275 splx(s);
275 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
276 DBG("smb_error=%d\n", smb_error);
277 return (smb_error);
278}
279
280int
281ichsmb_readb(device_t dev, u_char slave, char cmd, char *byte)
282{
283 const sc_p sc = device_get_softc(dev);
284 int smb_error;
276 DBG("smb_error=%d\n", smb_error);
277 return (smb_error);
278}
279
280int
281ichsmb_readb(device_t dev, u_char slave, char cmd, char *byte)
282{
283 const sc_p sc = device_get_softc(dev);
284 int smb_error;
285 int s;
286
287 DBG("slave=0x%02x cmd=0x%02x\n", slave, (u_char)cmd);
288 KASSERT(sc->ich_cmd == -1,
289 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
285
286 DBG("slave=0x%02x cmd=0x%02x\n", slave, (u_char)cmd);
287 KASSERT(sc->ich_cmd == -1,
288 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
290 s = splhigh();
289 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
291 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
292 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
293 (slave << 1) | ICH_XMIT_SLVA_READ);
294 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
295 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
296 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
297 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
298 *byte = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_D0);
290 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
291 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
292 (slave << 1) | ICH_XMIT_SLVA_READ);
293 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
294 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
295 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
296 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
297 *byte = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_D0);
299 splx(s);
298 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
300 DBG("smb_error=%d byte=0x%02x\n", smb_error, (u_char)*byte);
301 return (smb_error);
302}
303
304int
305ichsmb_readw(device_t dev, u_char slave, char cmd, short *word)
306{
307 const sc_p sc = device_get_softc(dev);
308 int smb_error;
299 DBG("smb_error=%d byte=0x%02x\n", smb_error, (u_char)*byte);
300 return (smb_error);
301}
302
303int
304ichsmb_readw(device_t dev, u_char slave, char cmd, short *word)
305{
306 const sc_p sc = device_get_softc(dev);
307 int smb_error;
309 int s;
310
311 DBG("slave=0x%02x cmd=0x%02x\n", slave, (u_char)cmd);
312 KASSERT(sc->ich_cmd == -1,
313 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
308
309 DBG("slave=0x%02x cmd=0x%02x\n", slave, (u_char)cmd);
310 KASSERT(sc->ich_cmd == -1,
311 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
314 s = splhigh();
312 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
315 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
316 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
317 (slave << 1) | ICH_XMIT_SLVA_READ);
318 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
319 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
320 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
321 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR) {
322 *word = (bus_space_read_1(sc->io_bst,
323 sc->io_bsh, ICH_D0) & 0xff)
324 | (bus_space_read_1(sc->io_bst,
325 sc->io_bsh, ICH_D1) << 8);
326 }
313 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
314 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
315 (slave << 1) | ICH_XMIT_SLVA_READ);
316 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
317 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
318 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
319 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR) {
320 *word = (bus_space_read_1(sc->io_bst,
321 sc->io_bsh, ICH_D0) & 0xff)
322 | (bus_space_read_1(sc->io_bst,
323 sc->io_bsh, ICH_D1) << 8);
324 }
327 splx(s);
325 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
328 DBG("smb_error=%d word=0x%04x\n", smb_error, (u_int16_t)*word);
329 return (smb_error);
330}
331
332int
333ichsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
334{
335 const sc_p sc = device_get_softc(dev);
336 int smb_error;
326 DBG("smb_error=%d word=0x%04x\n", smb_error, (u_int16_t)*word);
327 return (smb_error);
328}
329
330int
331ichsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
332{
333 const sc_p sc = device_get_softc(dev);
334 int smb_error;
337 int s;
338
339 DBG("slave=0x%02x cmd=0x%02x sdata=0x%04x\n",
340 slave, (u_char)cmd, (u_int16_t)sdata);
341 KASSERT(sc->ich_cmd == -1,
342 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
335
336 DBG("slave=0x%02x cmd=0x%02x sdata=0x%04x\n",
337 slave, (u_char)cmd, (u_int16_t)sdata);
338 KASSERT(sc->ich_cmd == -1,
339 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
343 s = splhigh();
340 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
344 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_PROC_CALL;
345 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
346 (slave << 1) | ICH_XMIT_SLVA_WRITE);
347 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
348 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, sdata & 0xff);
349 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D1, sdata >> 8);
350 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
351 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
352 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR) {
353 *rdata = (bus_space_read_1(sc->io_bst,
354 sc->io_bsh, ICH_D0) & 0xff)
355 | (bus_space_read_1(sc->io_bst,
356 sc->io_bsh, ICH_D1) << 8);
357 }
341 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_PROC_CALL;
342 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
343 (slave << 1) | ICH_XMIT_SLVA_WRITE);
344 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
345 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, sdata & 0xff);
346 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D1, sdata >> 8);
347 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
348 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
349 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR) {
350 *rdata = (bus_space_read_1(sc->io_bst,
351 sc->io_bsh, ICH_D0) & 0xff)
352 | (bus_space_read_1(sc->io_bst,
353 sc->io_bsh, ICH_D1) << 8);
354 }
358 splx(s);
355 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
359 DBG("smb_error=%d rdata=0x%04x\n", smb_error, (u_int16_t)*rdata);
360 return (smb_error);
361}
362
363int
364ichsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
365{
366 const sc_p sc = device_get_softc(dev);
367 int smb_error;
356 DBG("smb_error=%d rdata=0x%04x\n", smb_error, (u_int16_t)*rdata);
357 return (smb_error);
358}
359
360int
361ichsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
362{
363 const sc_p sc = device_get_softc(dev);
364 int smb_error;
368 int s;
369
370 DBG("slave=0x%02x cmd=0x%02x count=%d\n", slave, (u_char)cmd, count);
371#if ICHSMB_DEBUG
372#define DISP(ch) (((ch) < 0x20 || (ch) >= 0x7e) ? '.' : (ch))
373 {
374 u_char *p;
375
376 for (p = (u_char *)buf; p - (u_char *)buf < 32; p += 8) {

--- 10 unchanged lines hidden (view full) ---

387 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
388 if (count < 1 || count > 32)
389 return (EINVAL);
390 bcopy(buf, sc->block_data, count);
391 sc->block_count = count;
392 sc->block_index = 1;
393 sc->block_write = 1;
394
365
366 DBG("slave=0x%02x cmd=0x%02x count=%d\n", slave, (u_char)cmd, count);
367#if ICHSMB_DEBUG
368#define DISP(ch) (((ch) < 0x20 || (ch) >= 0x7e) ? '.' : (ch))
369 {
370 u_char *p;
371
372 for (p = (u_char *)buf; p - (u_char *)buf < 32; p += 8) {

--- 10 unchanged lines hidden (view full) ---

383 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
384 if (count < 1 || count > 32)
385 return (EINVAL);
386 bcopy(buf, sc->block_data, count);
387 sc->block_count = count;
388 sc->block_index = 1;
389 sc->block_write = 1;
390
395 s = splhigh();
391 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
396 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
397 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
398 (slave << 1) | ICH_XMIT_SLVA_WRITE);
399 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
400 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, count);
401 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_BLOCK_DB, buf[0]);
402 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
403 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
404 smb_error = ichsmb_wait(sc);
392 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
393 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
394 (slave << 1) | ICH_XMIT_SLVA_WRITE);
395 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
396 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, count);
397 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_BLOCK_DB, buf[0]);
398 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
399 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
400 smb_error = ichsmb_wait(sc);
405 splx(s);
401 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
406 DBG("smb_error=%d\n", smb_error);
407 return (smb_error);
408}
409
410int
411ichsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf)
412{
413 const sc_p sc = device_get_softc(dev);
414 int smb_error;
402 DBG("smb_error=%d\n", smb_error);
403 return (smb_error);
404}
405
406int
407ichsmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf)
408{
409 const sc_p sc = device_get_softc(dev);
410 int smb_error;
415 int s;
416
417 DBG("slave=0x%02x cmd=0x%02x count=%d\n", slave, (u_char)cmd, count);
418 KASSERT(sc->ich_cmd == -1,
419 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
420 if (count < 1 || count > 32)
421 return (EINVAL);
422 bzero(sc->block_data, sizeof(sc->block_data));
423 sc->block_count = count;
424 sc->block_index = 0;
425 sc->block_write = 0;
426
411
412 DBG("slave=0x%02x cmd=0x%02x count=%d\n", slave, (u_char)cmd, count);
413 KASSERT(sc->ich_cmd == -1,
414 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
415 if (count < 1 || count > 32)
416 return (EINVAL);
417 bzero(sc->block_data, sizeof(sc->block_data));
418 sc->block_count = count;
419 sc->block_index = 0;
420 sc->block_write = 0;
421
427 s = splhigh();
422 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
428 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
429 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
430 (slave << 1) | ICH_XMIT_SLVA_READ);
431 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
432 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, count); /* XXX? */
433 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
434 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
435 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
436 bcopy(sc->block_data, buf, sc->block_count);
423 sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
424 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_XMIT_SLVA,
425 (slave << 1) | ICH_XMIT_SLVA_READ);
426 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CMD, cmd);
427 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_D0, count); /* XXX? */
428 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_CNT,
429 ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
430 if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
431 bcopy(sc->block_data, buf, sc->block_count);
437 splx(s);
432 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
438 DBG("smb_error=%d\n", smb_error);
439#if ICHSMB_DEBUG
440#define DISP(ch) (((ch) < 0x20 || (ch) >= 0x7e) ? '.' : (ch))
441 {
442 u_char *p;
443
444 for (p = (u_char *)buf; p - (u_char *)buf < 32; p += 8) {
445 DBG("%02x: %02x %02x %02x %02x %02x %02x %02x %02x"

--- 44 unchanged lines hidden (view full) ---

490{
491 const sc_p sc = cookie;
492 const device_t dev = sc->dev;
493 const int maxloops = 16;
494 u_int8_t status;
495 u_int8_t ok_bits;
496 int cmd_index;
497 int count;
433 DBG("smb_error=%d\n", smb_error);
434#if ICHSMB_DEBUG
435#define DISP(ch) (((ch) < 0x20 || (ch) >= 0x7e) ? '.' : (ch))
436 {
437 u_char *p;
438
439 for (p = (u_char *)buf; p - (u_char *)buf < 32; p += 8) {
440 DBG("%02x: %02x %02x %02x %02x %02x %02x %02x %02x"

--- 44 unchanged lines hidden (view full) ---

485{
486 const sc_p sc = cookie;
487 const device_t dev = sc->dev;
488 const int maxloops = 16;
489 u_int8_t status;
490 u_int8_t ok_bits;
491 int cmd_index;
492 int count;
498 int s;
499
493
500 s = splhigh();
494 mtx_enter(&sc->mutex, MTX_DEF | MTX_NORECURSE);
501 for (count = 0; count < maxloops; count++) {
502
503 /* Get and reset status bits */
504 status = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_HST_STA);
505#if ICHSMB_DEBUG
506 if ((status & ~(ICH_HST_STA_INUSE_STS | ICH_HST_STA_HOST_BUSY))
507 || count > 0) {
508 DBG("%d stat=0x%02x\n", count, status);

--- 95 unchanged lines hidden (view full) ---

604 ICH_HST_STA, status);
605 wakeup(sc);
606 break;
607 }
608
609 /* Clear status bits and try again */
610 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_STA, status);
611 }
495 for (count = 0; count < maxloops; count++) {
496
497 /* Get and reset status bits */
498 status = bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_HST_STA);
499#if ICHSMB_DEBUG
500 if ((status & ~(ICH_HST_STA_INUSE_STS | ICH_HST_STA_HOST_BUSY))
501 || count > 0) {
502 DBG("%d stat=0x%02x\n", count, status);

--- 95 unchanged lines hidden (view full) ---

598 ICH_HST_STA, status);
599 wakeup(sc);
600 break;
601 }
602
603 /* Clear status bits and try again */
604 bus_space_write_1(sc->io_bst, sc->io_bsh, ICH_HST_STA, status);
605 }
612 splx(s);
606 mtx_exit(&sc->mutex, MTX_DEF | MTX_NORECURSE);
613
614 /* Too many loops? */
615 if (count == maxloops) {
616 log(LOG_ERR, "%s: interrupt loop, status=0x%02x\n",
617 device_get_nameunit(dev),
618 bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_HST_STA));
619 }
620}
621
622/*
607
608 /* Too many loops? */
609 if (count == maxloops) {
610 log(LOG_ERR, "%s: interrupt loop, status=0x%02x\n",
611 device_get_nameunit(dev),
612 bus_space_read_1(sc->io_bst, sc->io_bsh, ICH_HST_STA));
613 }
614}
615
616/*
623 * Wait for command completion. Assumes splhigh().
617 * Wait for command completion. Assumes mutex is held.
624 * Returns an SMB_* error code.
625 */
626static int
627ichsmb_wait(sc_p sc)
628{
629 const device_t dev = sc->dev;
630 int error, smb_error;
631
632 KASSERT(sc->ich_cmd != -1,
633 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
618 * Returns an SMB_* error code.
619 */
620static int
621ichsmb_wait(sc_p sc)
622{
623 const device_t dev = sc->dev;
624 int error, smb_error;
625
626 KASSERT(sc->ich_cmd != -1,
627 ("%s: ich_cmd=%d\n", __FUNCTION__ , sc->ich_cmd));
628 mtx_assert(&sc->mutex, MA_OWNED);
634sleep:
629sleep:
635 error = tsleep(sc, PZERO | PCATCH, "ichsmb", hz / 4);
636 DBG("tsleep -> %d\n", error);
630 error = msleep(sc, &sc->mutex, PZERO | PCATCH, "ichsmb", hz / 4);
631 DBG("msleep -> %d\n", error);
637 switch (error) {
638 case ERESTART:
639 if (sc->ich_cmd != -1)
640 goto sleep;
641 /* FALLTHROUGH */
642 case 0:
643 smb_error = sc->smb_error;
644 break;

--- 38 unchanged lines hidden ---
632 switch (error) {
633 case ERESTART:
634 if (sc->ich_cmd != -1)
635 goto sleep;
636 /* FALLTHROUGH */
637 case 0:
638 smb_error = sc->smb_error;
639 break;

--- 38 unchanged lines hidden ---