Lines Matching +full:ssif +full:- +full:bmc
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
74 device_t dev = sc->ipmi_dev;
75 device_t smbus = sc->ipmi_ssif_smbus;
88 ssif_buf[0] = req->ir_addr;
89 ssif_buf[1] = req->ir_command;
90 if (req->ir_requestlen > 0)
91 bcopy(req->ir_request, &ssif_buf[2],
92 min(req->ir_requestlen, SMBUS_DATA_SIZE - 2));
95 if (req->ir_requestlen <= 30) {
98 req->ir_requestlen + 2);
101 sc->ipmi_ssif_smbus_address, SMBUS_WRITE_SINGLE,
102 req->ir_requestlen + 2, ssif_buf));
105 device_printf(dev, "SSIF: WRITE_SINGLE error %d\n",
111 /* Longer requests are sent out in 32-byte messages. */
116 sc->ipmi_ssif_smbus_address, SMBUS_WRITE_START,
120 device_printf(dev, "SSIF: WRITE_START error %d\n",
126 len = req->ir_requestlen - (SMBUS_DATA_SIZE - 2);
127 cp = req->ir_request + (SMBUS_DATA_SIZE - 2);
134 sc->ipmi_ssif_smbus_address, SMBUS_WRITE_CONT,
138 device_printf(dev, "SSIF: WRITE_CONT error %d\n",
144 len -= SMBUS_DATA_SIZE;
148 * The final WRITE_CONT transaction has to have a non-zero
161 sc->ipmi_ssif_smbus_address, SMBUS_WRITE_CONT,
165 device_printf(dev, "SSIF: WRITE_CONT error %d\n",
176 /* Give the BMC 100ms to chew on the request. */
185 sc->ipmi_ssif_smbus_address, SMBUS_READ_START, &count, ssif_buf));
189 device_printf(dev, "SSIF: READ_START retry\n");
191 /* Give the BMC another 10ms. */
197 device_printf(dev, "SSIF: READ_START failed: %d\n", error);
202 device_printf(dev, "SSIF: READ_START: ok\n");
206 * If this is the first part of a multi-part read, then we need to
216 device_printf(dev, "SSIF: Short reply packet\n");
221 if (ssif_buf[offset] != IPMI_REPLY_ADDR(req->ir_addr)) {
222 device_printf(dev, "SSIF: Reply address mismatch\n");
227 if (ssif_buf[offset + 1] != req->ir_command) {
233 req->ir_compcode = ssif_buf[offset + 2];
240 len = count - 3;
241 bcopy(&ssif_buf[3], req->ir_reply,
242 min(req->ir_replybuflen, len));
247 * This is the first part of a multi-read transaction, so copy
251 dump_buffer(dev, "READ_START", ssif_buf + 2, count - 2);
253 bcopy(&ssif_buf[5], req->ir_reply, min(req->ir_replybuflen, count - 5));
254 len = count - 5;
261 sc->ipmi_ssif_smbus_address, SMBUS_READ_CONT, &count,
265 printf("SSIF: READ_CONT failed: %d\n", error);
270 device_printf(dev, "SSIF: READ_CONT... ok\n");
275 device_printf(dev, "SSIF: Read wrong block %d %d\n",
281 "SSIF: Read short middle block, length %d\n",
287 dump_buffer(dev, "READ_END", ssif_buf + 1, count - 1);
289 dump_buffer(dev, "READ_CONT", ssif_buf + 1, count - 1);
291 if (len < req->ir_replybuflen)
292 bcopy(&ssif_buf[1], &req->ir_reply[len],
293 min(req->ir_replybuflen - len, count - 1));
294 len += count - 1;
304 req->ir_replylen = len;
332 device_printf(sc->ipmi_dev,
333 "SSIF: Retrying request (%d)\n", i + 1);
337 req->ir_error = 0;
339 req->ir_error = EIO;
357 return (kproc_create(ssif_loop, sc, &sc->ipmi_kthread, 0, 0,
358 "%s: ssif", device_get_nameunit(sc->ipmi_dev)));
369 error = msleep(req, &sc->ipmi_requests_lock, 0, "ipmireq", 0);
371 error = req->ir_error;
381 sc->ipmi_ssif_smbus = smbus;
382 sc->ipmi_ssif_smbus_address = smbus_address;
385 sc->ipmi_startup = ssif_startup;
386 sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
387 sc->ipmi_driver_request = ssif_driver_request;