Lines Matching +full:wait +full:- +full:state

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
49 #define POLLING_DELAY_MIN 4 /* Waits are 2-3 usecs on typical systems */
64 while (ticks - start < MAX_TIMEOUT && (status & mask) != value) {
66 * The wait delay is increased exponentially to avoid putting
109 /* Wait for IBF = 0 */
115 /* Wait for IBF = 0 */
124 device_printf(sc->ipmi_dev,
131 /* Wait for IBF = 0 */
136 /* Wait for OBF = 1 */
142 device_printf(sc->ipmi_dev, "KCS error: %02x\n",
148 /* Wait for IBF = 0 */
152 /* IDLE STATE */
154 /* Wait for OBF = 1 */
162 device_printf(sc->ipmi_dev, "KCS: Error retry exhausted\n");
175 /* Wait for IBF = 0 */
186 /* Wait for IBF = 0 */
197 /* error state */
218 /* Wait for IBF = 0 */
242 /* Wait for IBF = 0 */
248 /* error state */
267 /* Wait for IBF = 0 */
270 /* Read State */
273 /* Wait for OBF = 1 */
286 /* Idle State */
289 /* Wait for OBF = 1*/
299 /* Error State */
311 int i, state;
317 device_printf(sc->ipmi_dev, "KCS: Failed to start write\n");
321 device_printf(sc->ipmi_dev, "KCS: WRITE_START... ok\n");
324 if (!kcs_write_byte(sc, req->ir_addr)) {
325 device_printf(sc->ipmi_dev, "KCS: Failed to write address\n");
329 device_printf(sc->ipmi_dev, "KCS: Wrote address: %02x\n", req->ir_addr);
332 if (req->ir_requestlen == 0) {
333 if (!kcs_write_last_byte(sc, req->ir_command)) {
334 device_printf(sc->ipmi_dev,
339 device_printf(sc->ipmi_dev, "KCS: Wrote command: %02x\n",
340 req->ir_command);
343 if (!kcs_write_byte(sc, req->ir_command)) {
344 device_printf(sc->ipmi_dev,
349 device_printf(sc->ipmi_dev, "KCS: Wrote command: %02x\n",
350 req->ir_command);
353 cp = req->ir_request;
354 for (i = 0; i < req->ir_requestlen - 1; i++) {
356 device_printf(sc->ipmi_dev,
362 device_printf(sc->ipmi_dev, "KCS: Wrote data: %02x\n",
363 cp[-1]);
368 device_printf(sc->ipmi_dev,
373 device_printf(sc->ipmi_dev, "KCS: Wrote last data: %02x\n",
380 device_printf(sc->ipmi_dev, "KCS: Failed to read address\n");
384 device_printf(sc->ipmi_dev, "KCS: Read address: %02x\n", data);
386 if (data != IPMI_REPLY_ADDR(req->ir_addr)) {
387 device_printf(sc->ipmi_dev, "KCS: Reply address mismatch\n");
393 device_printf(sc->ipmi_dev, "KCS: Failed to read command\n");
397 device_printf(sc->ipmi_dev, "KCS: Read command: %02x\n", data);
399 if (data != req->ir_command) {
400 device_printf(sc->ipmi_dev, "KCS: Command mismatch\n");
405 if (kcs_read_byte(sc, &req->ir_compcode) != 1) {
407 device_printf(sc->ipmi_dev,
413 device_printf(sc->ipmi_dev, "KCS: Read completion code: %02x\n",
414 req->ir_compcode);
420 state = kcs_read_byte(sc, &data);
421 if (state == 0) {
422 device_printf(sc->ipmi_dev,
426 if (state == 2)
428 if (i < req->ir_replybuflen) {
429 req->ir_reply[i] = data;
431 device_printf(sc->ipmi_dev, "KCS: Read data %02x\n",
434 device_printf(sc->ipmi_dev,
441 req->ir_replylen = i;
443 device_printf(sc->ipmi_dev, "KCS: READ finished (%d bytes)\n", i);
444 if (req->ir_replybuflen < i)
446 if (req->ir_replybuflen < i && req->ir_replybuflen != 0)
448 device_printf(sc->ipmi_dev,
450 req->ir_replybuflen, i);
472 req->ir_error = 0;
474 req->ir_error = EIO;
486 return (kproc_create(kcs_loop, sc, &sc->ipmi_kthread, 0, 0, "%s: kcs",
487 device_get_nameunit(sc->ipmi_dev)));
497 error = msleep(req, &sc->ipmi_requests_lock, 0, "ipmireq", 0);
499 error = req->ir_error;
513 req->ir_error = 0;
515 req->ir_error = EIO;
516 return (req->ir_error);
536 sc->ipmi_startup = kcs_startup;
537 sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
538 sc->ipmi_driver_request = kcs_driver_request;
539 sc->ipmi_driver_requests_polled = 1;
544 device_printf(sc->ipmi_dev, "couldn't find it\n");
549 device_printf(sc->ipmi_dev, "KCS: initial state: %02x\n", status);
562 * we write the command, that bit should be set, so we should get a non-zero
571 sc->ipmi_io_spacing = 1;
574 device_printf(sc->ipmi_dev, "Trying KCS align %d... ", sc->ipmi_io_spacing);
577 /* Wait for IBF = 0 */
586 /* Wait for IBF = 0 */
598 sc->ipmi_io_spacing <<= 1;
599 if (sc->ipmi_io_spacing > 4)
616 /* Wait for IBF = 0 */
624 /* Wait for IBF = 1 */
636 /* Wait for IBF = 0 */
645 /* Wait for IBF = 1 */
655 device_printf(sc->ipmi_dev, "KCS probe: end state %x\n",