Deleted Added
full compact
pdq.c (50477) pdq.c (93383)
1/* $NetBSD: pdq.c,v 1.33 2001/11/13 13:14:43 lukem Exp $ */
2
1/*-
2 * Copyright (c) 1995,1996 Matt Thomas <matt@3am-software.com>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. The name of the author may not be used to endorse or promote products
3/*-
4 * Copyright (c) 1995,1996 Matt Thomas <matt@3am-software.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. The name of the author may not be used to endorse or promote products
11 * derived from this software withough specific prior written permission
13 * derived from this software without specific prior written permission
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
24 * $FreeBSD: head/sys/dev/pdq/pdq.c 50477 1999-08-28 01:08:13Z peter $
26 * Id: pdq.c,v 1.32 1997/06/05 01:56:35 thomas Exp
27 * $FreeBSD: head/sys/dev/pdq/pdq.c 93383 2002-03-29 11:22:22Z mdodd $
25 *
26 */
27
28/*
29 * DEC PDQ FDDI Controller O/S independent code
30 *
28 *
29 */
30
31/*
32 * DEC PDQ FDDI Controller O/S independent code
33 *
31 * This module should work any PDQ based board. Note that changes for
34 * This module should work any on PDQ based board. Note that changes for
32 * MIPS and Alpha architectures (or any other architecture which requires
33 * a flushing of memory or write buffers and/or has incoherent caches)
34 * have yet to be made.
35 *
36 * However, it is expected that the PDQ_CSR_WRITE macro will cause a
37 * flushing of the write buffers.
38 */
39
35 * MIPS and Alpha architectures (or any other architecture which requires
36 * a flushing of memory or write buffers and/or has incoherent caches)
37 * have yet to be made.
38 *
39 * However, it is expected that the PDQ_CSR_WRITE macro will cause a
40 * flushing of the write buffers.
41 */
42
43#ifdef __NetBSD__
44#include <sys/cdefs.h>
45__KERNEL_RCSID(0, "$NetBSD: pdq.c,v 1.33 2001/11/13 13:14:43 lukem Exp $");
46#endif
47
40#define PDQ_HWSUPPORT /* for pdq.h */
41
42#if defined(__FreeBSD__)
48#define PDQ_HWSUPPORT /* for pdq.h */
49
50#if defined(__FreeBSD__)
43#include <dev/pdq/pdqvar.h>
51/*
52 * What a botch having to specific includes for FreeBSD!
53 */
54#include <dev/pdq/pdq_freebsd.h>
44#include <dev/pdq/pdqreg.h>
45#else
46#include "pdqvar.h"
47#include "pdqreg.h"
48#endif
49
50#define PDQ_ROUNDUP(n, x) (((n) + ((x) - 1)) & ~((x) - 1))
51#define PDQ_CMD_RX_ALIGNMENT 16

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

71 * The following are used in conjunction with
72 * unsolicited events
73 */
74static const char * const pdq_entities[] = {
75 "Station", "Link", "Phy Port"
76};
77
78static const char * const pdq_station_events[] = {
55#include <dev/pdq/pdqreg.h>
56#else
57#include "pdqvar.h"
58#include "pdqreg.h"
59#endif
60
61#define PDQ_ROUNDUP(n, x) (((n) + ((x) - 1)) & ~((x) - 1))
62#define PDQ_CMD_RX_ALIGNMENT 16

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

82 * The following are used in conjunction with
83 * unsolicited events
84 */
85static const char * const pdq_entities[] = {
86 "Station", "Link", "Phy Port"
87};
88
89static const char * const pdq_station_events[] = {
90 "Unknown Event #0",
79 "Trace Received"
80};
81
82static const char * const pdq_station_arguments[] = {
83 "Reason"
84};
85
86static const char * const pdq_link_events[] = {

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

213 pdq_pmd_types[rsp->status_chars_get.pmd_type[0] / 100][rsp->status_chars_get.pmd_type[0] % 100]);
214
215 if (rsp->status_chars_get.station_type == PDQ_STATION_TYPE_DAS)
216 printf(", FDDI Port[B] = %c (PMD = %s)",
217 pdq_phy_types[rsp->status_chars_get.phy_type[1]],
218 pdq_pmd_types[rsp->status_chars_get.pmd_type[1] / 100][rsp->status_chars_get.pmd_type[1] % 100]);
219
220 printf("\n");
91 "Trace Received"
92};
93
94static const char * const pdq_station_arguments[] = {
95 "Reason"
96};
97
98static const char * const pdq_link_events[] = {

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

225 pdq_pmd_types[rsp->status_chars_get.pmd_type[0] / 100][rsp->status_chars_get.pmd_type[0] % 100]);
226
227 if (rsp->status_chars_get.station_type == PDQ_STATION_TYPE_DAS)
228 printf(", FDDI Port[B] = %c (PMD = %s)",
229 pdq_phy_types[rsp->status_chars_get.phy_type[1]],
230 pdq_pmd_types[rsp->status_chars_get.pmd_type[1] / 100][rsp->status_chars_get.pmd_type[1] % 100]);
231
232 printf("\n");
233
234 pdq_os_update_status(pdq, rsp);
221}
222
223static void
224pdq_init_csrs(
225 pdq_csrs_t *csrs,
226 pdq_bus_t bus,
227 pdq_bus_memaddr_t csr_base,
228 size_t csrsize)

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

256 csrs->csr_pfi_mode_control = PDQ_CSR_OFFSET(csr_base, 16 * csrsize);
257 csrs->csr_pfi_status = PDQ_CSR_OFFSET(csr_base, 17 * csrsize);
258 csrs->csr_fifo_write = PDQ_CSR_OFFSET(csr_base, 18 * csrsize);
259 csrs->csr_fifo_read = PDQ_CSR_OFFSET(csr_base, 19 * csrsize);
260}
261
262static void
263pdq_flush_databuf_queue(
235}
236
237static void
238pdq_init_csrs(
239 pdq_csrs_t *csrs,
240 pdq_bus_t bus,
241 pdq_bus_memaddr_t csr_base,
242 size_t csrsize)

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

270 csrs->csr_pfi_mode_control = PDQ_CSR_OFFSET(csr_base, 16 * csrsize);
271 csrs->csr_pfi_status = PDQ_CSR_OFFSET(csr_base, 17 * csrsize);
272 csrs->csr_fifo_write = PDQ_CSR_OFFSET(csr_base, 18 * csrsize);
273 csrs->csr_fifo_read = PDQ_CSR_OFFSET(csr_base, 19 * csrsize);
274}
275
276static void
277pdq_flush_databuf_queue(
278 pdq_t *pdq,
264 pdq_databuf_queue_t *q)
265{
266 PDQ_OS_DATABUF_T *pdu;
267 for (;;) {
268 PDQ_OS_DATABUF_DEQUEUE(q, pdu);
269 if (pdu == NULL)
270 return;
279 pdq_databuf_queue_t *q)
280{
281 PDQ_OS_DATABUF_T *pdu;
282 for (;;) {
283 PDQ_OS_DATABUF_DEQUEUE(q, pdu);
284 if (pdu == NULL)
285 return;
271 PDQ_OS_DATABUF_FREE(pdu);
286 PDQ_OS_DATABUF_FREE(pdq, pdu);
272 }
273}
274
275static pdq_boolean_t
276pdq_do_port_control(
277 const pdq_csrs_t * const csrs,
278 pdq_uint32_t cmd)
279{

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

404 { sizeof(pdq_cmd_addr_filter_set_t), /* 7 - PDQC_ADDR_FILTER_SET */
405 sizeof(pdq_response_generic_t),
406 "Addr Filter Set"
407 },
408 { sizeof(pdq_cmd_generic_t), /* 8 - PDQC_ADDR_FILTER_GET */
409 sizeof(pdq_response_addr_filter_get_t),
410 "Addr Filter Get"
411 },
287 }
288}
289
290static pdq_boolean_t
291pdq_do_port_control(
292 const pdq_csrs_t * const csrs,
293 pdq_uint32_t cmd)
294{

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

419 { sizeof(pdq_cmd_addr_filter_set_t), /* 7 - PDQC_ADDR_FILTER_SET */
420 sizeof(pdq_response_generic_t),
421 "Addr Filter Set"
422 },
423 { sizeof(pdq_cmd_generic_t), /* 8 - PDQC_ADDR_FILTER_GET */
424 sizeof(pdq_response_addr_filter_get_t),
425 "Addr Filter Get"
426 },
412#if 0
413 { sizeof(pdq_cmd_generic_t), /* 9 - PDQC_ERROR_LOG_CLEAR */
414 sizeof(pdq_response_generic_t),
415 "Error Log Clear"
416 },
417 { sizeof(pdq_cmd_generic_t), /* 10 - PDQC_ERROR_LOG_SET */
418 sizeof(pdq_response_generic_t),
419 "Error Log Set"
420 },

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

438 { sizeof(pdq_cmd_generic_t), /* 16 - PDQC_SMT_MIB_GET */
439 sizeof(pdq_response_generic_t),
440 "SMT MIB Get"
441 },
442 { sizeof(pdq_cmd_generic_t), /* 17 - PDQC_SMT_MIB_SET */
443 sizeof(pdq_response_generic_t),
444 "SMT MIB Set",
445 },
427 { sizeof(pdq_cmd_generic_t), /* 9 - PDQC_ERROR_LOG_CLEAR */
428 sizeof(pdq_response_generic_t),
429 "Error Log Clear"
430 },
431 { sizeof(pdq_cmd_generic_t), /* 10 - PDQC_ERROR_LOG_SET */
432 sizeof(pdq_response_generic_t),
433 "Error Log Set"
434 },

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

452 { sizeof(pdq_cmd_generic_t), /* 16 - PDQC_SMT_MIB_GET */
453 sizeof(pdq_response_generic_t),
454 "SMT MIB Get"
455 },
456 { sizeof(pdq_cmd_generic_t), /* 17 - PDQC_SMT_MIB_SET */
457 sizeof(pdq_response_generic_t),
458 "SMT MIB Set",
459 },
446#endif
460 { 0, 0, "Bogus CMD" },
447};
448
449static void
450pdq_queue_commands(
451 pdq_t *pdq)
452{
453 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
454 pdq_command_info_t * const ci = &pdq->pdq_command_info;
455 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
461};
462
463static void
464pdq_queue_commands(
465 pdq_t *pdq)
466{
467 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
468 pdq_command_info_t * const ci = &pdq->pdq_command_info;
469 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
470 pdq_txdesc_t * const txd = &dbp->pdqdb_command_requests[ci->ci_request_producer];
456 pdq_cmd_code_t op;
457 pdq_uint32_t cmdlen, rsplen, mask;
458
459 /*
460 * If there are commands or responses active or there aren't
461 * any pending commands, then don't queue any more.
462 */
463 if (ci->ci_command_active || ci->ci_pending_commands == 0)

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

482 * Since only one command at a time will be queued, there will always
483 * be enough space.
484 */
485
486 /*
487 * Obtain and fill in the descriptor for the command (descriptor is
488 * pre-initialized)
489 */
471 pdq_cmd_code_t op;
472 pdq_uint32_t cmdlen, rsplen, mask;
473
474 /*
475 * If there are commands or responses active or there aren't
476 * any pending commands, then don't queue any more.
477 */
478 if (ci->ci_command_active || ci->ci_pending_commands == 0)

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

497 * Since only one command at a time will be queued, there will always
498 * be enough space.
499 */
500
501 /*
502 * Obtain and fill in the descriptor for the command (descriptor is
503 * pre-initialized)
504 */
490 dbp->pdqdb_command_requests[ci->ci_request_producer].txd_seg_len = cmdlen;
491 PDQ_ADVANCE(ci->ci_request_producer, 1, PDQ_RING_MASK(dbp->pdqdb_command_requests));
505 txd->txd_seg_len = cmdlen;
492
493 /*
506
507 /*
494 * Obtain and fill in the descriptor for the response (descriptor is
495 * pre-initialized)
496 */
497 dbp->pdqdb_command_responses[ci->ci_response_producer].rxd_seg_len_hi = cmdlen / 16;
498 PDQ_ADVANCE(ci->ci_response_producer, 1, PDQ_RING_MASK(dbp->pdqdb_command_responses));
499
500 /*
501 * Clear the command area, set the opcode, and the command from the pending
502 * mask.
503 */
504
508 * Clear the command area, set the opcode, and the command from the pending
509 * mask.
510 */
511
505 PDQ_OS_MEMZERO(ci->ci_bufstart, cmdlen);
506 *(pdq_cmd_code_t *) ci->ci_bufstart = op;
512 ci->ci_queued_commands[ci->ci_request_producer] = op;
513#if defined(PDQVERBOSE)
514 ((pdq_response_generic_t *) ci->ci_response_bufstart)->generic_op = PDQC_BOGUS_CMD;
515#endif
516 PDQ_OS_MEMZERO(ci->ci_request_bufstart, cmdlen);
517 *(pdq_cmd_code_t *) ci->ci_request_bufstart = op;
507 ci->ci_pending_commands &= ~mask;
508
509 /*
510 * Fill in the command area, if needed.
511 */
512 switch (op) {
513 case PDQC_FILTER_SET: {
518 ci->ci_pending_commands &= ~mask;
519
520 /*
521 * Fill in the command area, if needed.
522 */
523 switch (op) {
524 case PDQC_FILTER_SET: {
514 pdq_cmd_filter_set_t *filter_set = (pdq_cmd_filter_set_t *) ci->ci_bufstart;
525 pdq_cmd_filter_set_t *filter_set = (pdq_cmd_filter_set_t *) ci->ci_request_bufstart;
515 unsigned idx = 0;
516 filter_set->filter_set_items[idx].item_code = PDQI_IND_GROUP_PROM;
517 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PROMISC ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
518 idx++;
519 filter_set->filter_set_items[idx].item_code = PDQI_GROUP_PROM;
520 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_ALLMULTI ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
521 idx++;
522 filter_set->filter_set_items[idx].item_code = PDQI_SMT_PROM;
523 filter_set->filter_set_items[idx].filter_state = ((pdq->pdq_flags & (PDQ_PROMISC|PDQ_PASS_SMT)) == (PDQ_PROMISC|PDQ_PASS_SMT) ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
524 idx++;
525 filter_set->filter_set_items[idx].item_code = PDQI_SMT_USER;
526 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PASS_SMT ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
527 idx++;
528 filter_set->filter_set_items[idx].item_code = PDQI_EOL;
529 break;
530 }
531 case PDQC_ADDR_FILTER_SET: {
526 unsigned idx = 0;
527 filter_set->filter_set_items[idx].item_code = PDQI_IND_GROUP_PROM;
528 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PROMISC ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
529 idx++;
530 filter_set->filter_set_items[idx].item_code = PDQI_GROUP_PROM;
531 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_ALLMULTI ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
532 idx++;
533 filter_set->filter_set_items[idx].item_code = PDQI_SMT_PROM;
534 filter_set->filter_set_items[idx].filter_state = ((pdq->pdq_flags & (PDQ_PROMISC|PDQ_PASS_SMT)) == (PDQ_PROMISC|PDQ_PASS_SMT) ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
535 idx++;
536 filter_set->filter_set_items[idx].item_code = PDQI_SMT_USER;
537 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PASS_SMT ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
538 idx++;
539 filter_set->filter_set_items[idx].item_code = PDQI_EOL;
540 break;
541 }
542 case PDQC_ADDR_FILTER_SET: {
532 pdq_cmd_addr_filter_set_t *addr_filter_set = (pdq_cmd_addr_filter_set_t *) ci->ci_bufstart;
543 pdq_cmd_addr_filter_set_t *addr_filter_set = (pdq_cmd_addr_filter_set_t *) ci->ci_request_bufstart;
533 pdq_lanaddr_t *addr = addr_filter_set->addr_filter_set_addresses;
534 addr->lanaddr_bytes[0] = 0xFF;
535 addr->lanaddr_bytes[1] = 0xFF;
536 addr->lanaddr_bytes[2] = 0xFF;
537 addr->lanaddr_bytes[3] = 0xFF;
538 addr->lanaddr_bytes[4] = 0xFF;
539 addr->lanaddr_bytes[5] = 0xFF;
540 addr++;
541 pdq_os_addr_fill(pdq, addr, 61);
542 break;
543 }
544 pdq_lanaddr_t *addr = addr_filter_set->addr_filter_set_addresses;
545 addr->lanaddr_bytes[0] = 0xFF;
546 addr->lanaddr_bytes[1] = 0xFF;
547 addr->lanaddr_bytes[2] = 0xFF;
548 addr->lanaddr_bytes[3] = 0xFF;
549 addr->lanaddr_bytes[4] = 0xFF;
550 addr->lanaddr_bytes[5] = 0xFF;
551 addr++;
552 pdq_os_addr_fill(pdq, addr, 61);
553 break;
554 }
555 case PDQC_SNMP_SET: {
556 pdq_cmd_snmp_set_t *snmp_set = (pdq_cmd_snmp_set_t *) ci->ci_request_bufstart;
557 unsigned idx = 0;
558 snmp_set->snmp_set_items[idx].item_code = PDQSNMP_FULL_DUPLEX_ENABLE;
559 snmp_set->snmp_set_items[idx].item_value = (pdq->pdq_flags & PDQ_WANT_FDX ? 1 : 2);
560 snmp_set->snmp_set_items[idx].item_port = 0;
561 idx++;
562 snmp_set->snmp_set_items[idx].item_code = PDQSNMP_EOL;
563 break;
564 }
544 default: { /* to make gcc happy */
545 break;
546 }
547 }
565 default: { /* to make gcc happy */
566 break;
567 }
568 }
569
570
548 /*
571 /*
572 * Sync the command request buffer and descriptor, then advance
573 * the request producer index.
574 */
575 PDQ_OS_CMDRQST_PRESYNC(pdq, txd->txd_seg_len);
576 PDQ_OS_DESC_PRESYNC(pdq, txd, sizeof(pdq_txdesc_t));
577 PDQ_ADVANCE(ci->ci_request_producer, 1, PDQ_RING_MASK(dbp->pdqdb_command_requests));
578
579 /*
580 * Sync the command response buffer and advance the response
581 * producer index (descriptor is already pre-initialized)
582 */
583 PDQ_OS_CMDRSP_PRESYNC(pdq, PDQ_SIZE_COMMAND_RESPONSE);
584 PDQ_ADVANCE(ci->ci_response_producer, 1, PDQ_RING_MASK(dbp->pdqdb_command_responses));
585 /*
549 * At this point the command is done. All that needs to be done is to
550 * produce it to the PDQ.
551 */
552 PDQ_PRINTF(("PDQ Queue Command Request: %s queued\n",
553 pdq_cmd_info[op].cmd_name));
554
555 ci->ci_command_active++;
556 PDQ_CSR_WRITE(csrs, csr_cmd_response_producer, ci->ci_response_producer | (ci->ci_response_completion << 8));

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

573 * consumed then the command must have been as well.
574 */
575
576 if (cbp->pdqcb_command_response == ci->ci_response_completion)
577 return;
578
579 PDQ_ASSERT(cbp->pdqcb_command_request != ci->ci_request_completion);
580
586 * At this point the command is done. All that needs to be done is to
587 * produce it to the PDQ.
588 */
589 PDQ_PRINTF(("PDQ Queue Command Request: %s queued\n",
590 pdq_cmd_info[op].cmd_name));
591
592 ci->ci_command_active++;
593 PDQ_CSR_WRITE(csrs, csr_cmd_response_producer, ci->ci_response_producer | (ci->ci_response_completion << 8));

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

610 * consumed then the command must have been as well.
611 */
612
613 if (cbp->pdqcb_command_response == ci->ci_response_completion)
614 return;
615
616 PDQ_ASSERT(cbp->pdqcb_command_request != ci->ci_request_completion);
617
581 rspgen = (const pdq_response_generic_t *) ci->ci_bufstart;
618 PDQ_OS_CMDRSP_POSTSYNC(pdq, PDQ_SIZE_COMMAND_RESPONSE);
619 rspgen = (const pdq_response_generic_t *) ci->ci_response_bufstart;
620 PDQ_ASSERT(rspgen->generic_op == ci->ci_queued_commands[ci->ci_request_completion]);
582 PDQ_ASSERT(rspgen->generic_status == PDQR_SUCCESS);
621 PDQ_ASSERT(rspgen->generic_status == PDQR_SUCCESS);
583 PDQ_PRINTF(("PDQ Process Command Response: %s completed (status=%d)\n",
622 PDQ_PRINTF(("PDQ Process Command Response: %s completed (status=%d [0x%x])\n",
584 pdq_cmd_info[rspgen->generic_op].cmd_name,
623 pdq_cmd_info[rspgen->generic_op].cmd_name,
585 rspgen->generic_status));
624 rspgen->generic_status, rspgen->generic_status));
586
587 if (rspgen->generic_op == PDQC_STATUS_CHARS_GET && (pdq->pdq_flags & PDQ_PRINTCHARS)) {
588 pdq->pdq_flags &= ~PDQ_PRINTCHARS;
589 pdq_print_fddi_chars(pdq, (const pdq_response_status_chars_get_t *) rspgen);
625
626 if (rspgen->generic_op == PDQC_STATUS_CHARS_GET && (pdq->pdq_flags & PDQ_PRINTCHARS)) {
627 pdq->pdq_flags &= ~PDQ_PRINTCHARS;
628 pdq_print_fddi_chars(pdq, (const pdq_response_status_chars_get_t *) rspgen);
629 } else if (rspgen->generic_op == PDQC_DEC_EXT_MIB_GET) {
630 pdq->pdq_flags &= ~PDQ_IS_FDX;
631 if (((const pdq_response_dec_ext_mib_get_t *)rspgen)->dec_ext_mib_get.fdx_operational)
632 pdq->pdq_flags |= PDQ_IS_FDX;
590 }
591
592 PDQ_ADVANCE(ci->ci_request_completion, 1, PDQ_RING_MASK(dbp->pdqdb_command_requests));
593 PDQ_ADVANCE(ci->ci_response_completion, 1, PDQ_RING_MASK(dbp->pdqdb_command_responses));
594 ci->ci_command_active = 0;
595
596 if (ci->ci_pending_commands != 0) {
597 pdq_queue_commands(pdq);

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

612static void
613pdq_process_unsolicited_events(
614 pdq_t *pdq)
615{
616 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
617 pdq_unsolicited_info_t *ui = &pdq->pdq_unsolicited_info;
618 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
619 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
633 }
634
635 PDQ_ADVANCE(ci->ci_request_completion, 1, PDQ_RING_MASK(dbp->pdqdb_command_requests));
636 PDQ_ADVANCE(ci->ci_response_completion, 1, PDQ_RING_MASK(dbp->pdqdb_command_responses));
637 ci->ci_command_active = 0;
638
639 if (ci->ci_pending_commands != 0) {
640 pdq_queue_commands(pdq);

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

655static void
656pdq_process_unsolicited_events(
657 pdq_t *pdq)
658{
659 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
660 pdq_unsolicited_info_t *ui = &pdq->pdq_unsolicited_info;
661 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
662 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
620 const pdq_unsolicited_event_t *event;
621 pdq_rxdesc_t *rxd;
622
623 /*
624 * Process each unsolicited event (if any).
625 */
626
627 while (cbp->pdqcb_unsolicited_event != ui->ui_completion) {
663
664 /*
665 * Process each unsolicited event (if any).
666 */
667
668 while (cbp->pdqcb_unsolicited_event != ui->ui_completion) {
628 rxd = &dbp->pdqdb_unsolicited_events[ui->ui_completion];
669 const pdq_unsolicited_event_t *event;
629 event = &ui->ui_events[ui->ui_completion & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
670 event = &ui->ui_events[ui->ui_completion & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
671 PDQ_OS_UNSOL_EVENT_POSTSYNC(pdq, event);
630
631 switch (event->event_type) {
632 case PDQ_UNSOLICITED_EVENT: {
672
673 switch (event->event_type) {
674 case PDQ_UNSOLICITED_EVENT: {
675 int bad_event = 0;
676 switch (event->event_entity) {
677 case PDQ_ENTITY_STATION: {
678 bad_event = event->event_code.value >= PDQ_STATION_EVENT_MAX;
679 break;
680 }
681 case PDQ_ENTITY_LINK: {
682 bad_event = event->event_code.value >= PDQ_LINK_EVENT_MAX;
683 break;
684 }
685 case PDQ_ENTITY_PHY_PORT: {
686 bad_event = event->event_code.value >= PDQ_PHY_EVENT_MAX;
687 break;
688 }
689 default: {
690 bad_event = 1;
691 break;
692 }
693 }
694 if (bad_event) {
695 break;
696 }
633 printf(PDQ_OS_PREFIX "Unsolicited Event: %s: %s",
634 PDQ_OS_PREFIX_ARGS,
635 pdq_entities[event->event_entity],
636 pdq_event_codes[event->event_entity][event->event_code.value]);
637 if (event->event_entity == PDQ_ENTITY_PHY_PORT)
638 printf("[%d]", event->event_index);
639 printf("\n");
640 break;
641 }
642 case PDQ_UNSOLICITED_COUNTERS: {
643 break;
644 }
645 }
697 printf(PDQ_OS_PREFIX "Unsolicited Event: %s: %s",
698 PDQ_OS_PREFIX_ARGS,
699 pdq_entities[event->event_entity],
700 pdq_event_codes[event->event_entity][event->event_code.value]);
701 if (event->event_entity == PDQ_ENTITY_PHY_PORT)
702 printf("[%d]", event->event_index);
703 printf("\n");
704 break;
705 }
706 case PDQ_UNSOLICITED_COUNTERS: {
707 break;
708 }
709 }
710 PDQ_OS_UNSOL_EVENT_PRESYNC(pdq, event);
646 PDQ_ADVANCE(ui->ui_completion, 1, PDQ_RING_MASK(dbp->pdqdb_unsolicited_events));
647 ui->ui_free++;
648 }
649
650 /*
651 * Now give back the event buffers back to the PDQ.
652 */
653 PDQ_ADVANCE(ui->ui_producer, ui->ui_free, PDQ_RING_MASK(dbp->pdqdb_unsolicited_events));

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

674 while (completion != completion_goal) {
675 PDQ_OS_DATABUF_T *fpdu, *lpdu, *npdu;
676 pdq_uint8_t *dataptr;
677 pdq_uint32_t fc, datalen, pdulen, segcnt;
678 pdq_rxstatus_t status;
679
680 fpdu = lpdu = buffers[completion];
681 PDQ_ASSERT(fpdu != NULL);
711 PDQ_ADVANCE(ui->ui_completion, 1, PDQ_RING_MASK(dbp->pdqdb_unsolicited_events));
712 ui->ui_free++;
713 }
714
715 /*
716 * Now give back the event buffers back to the PDQ.
717 */
718 PDQ_ADVANCE(ui->ui_producer, ui->ui_free, PDQ_RING_MASK(dbp->pdqdb_unsolicited_events));

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

739 while (completion != completion_goal) {
740 PDQ_OS_DATABUF_T *fpdu, *lpdu, *npdu;
741 pdq_uint8_t *dataptr;
742 pdq_uint32_t fc, datalen, pdulen, segcnt;
743 pdq_rxstatus_t status;
744
745 fpdu = lpdu = buffers[completion];
746 PDQ_ASSERT(fpdu != NULL);
682
747 PDQ_OS_RXPDU_POSTSYNC(pdq, fpdu, 0, sizeof(u_int32_t));
683 dataptr = PDQ_OS_DATABUF_PTR(fpdu);
684 status = *(pdq_rxstatus_t *) dataptr;
748 dataptr = PDQ_OS_DATABUF_PTR(fpdu);
749 status = *(pdq_rxstatus_t *) dataptr;
685 if ((status.rxs_status & 0x200000) == 0) {
686 datalen = status.rxs_status & 0x1FFF;
750 if (status.rxs_rcc_badpdu == 0) {
751 datalen = status.rxs_len;
752 PDQ_OS_RXPDU_POSTSYNC(pdq, fpdu, sizeof(u_int32_t),
753 PDQ_RX_FC_OFFSET + 1 - sizeof(u_int32_t));
687 fc = dataptr[PDQ_RX_FC_OFFSET];
688 switch (fc & (PDQ_FDDIFC_C|PDQ_FDDIFC_L|PDQ_FDDIFC_F)) {
689 case PDQ_FDDI_LLC_ASYNC:
690 case PDQ_FDDI_LLC_SYNC:
691 case PDQ_FDDI_IMP_ASYNC:
692 case PDQ_FDDI_IMP_SYNC: {
693 if (datalen > PDQ_FDDI_MAX || datalen < PDQ_FDDI_LLC_MIN) {
694 PDQ_PRINTF(("discard: bad length %d\n", datalen));

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

705 PDQ_PRINTF(("discard: bad fc 0x%x\n", fc));
706 goto discard_frame;
707 }
708 }
709 /*
710 * Update the lengths of the data buffers now that we know
711 * the real length.
712 */
754 fc = dataptr[PDQ_RX_FC_OFFSET];
755 switch (fc & (PDQ_FDDIFC_C|PDQ_FDDIFC_L|PDQ_FDDIFC_F)) {
756 case PDQ_FDDI_LLC_ASYNC:
757 case PDQ_FDDI_LLC_SYNC:
758 case PDQ_FDDI_IMP_ASYNC:
759 case PDQ_FDDI_IMP_SYNC: {
760 if (datalen > PDQ_FDDI_MAX || datalen < PDQ_FDDI_LLC_MIN) {
761 PDQ_PRINTF(("discard: bad length %d\n", datalen));

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

772 PDQ_PRINTF(("discard: bad fc 0x%x\n", fc));
773 goto discard_frame;
774 }
775 }
776 /*
777 * Update the lengths of the data buffers now that we know
778 * the real length.
779 */
713 pdulen = datalen - 4 /* CRC */;
714 segcnt = (pdulen + PDQ_RX_FC_OFFSET + PDQ_OS_DATABUF_SIZE - 1) / PDQ_OS_DATABUF_SIZE;
715 PDQ_OS_DATABUF_ALLOC(npdu);
780 pdulen = datalen + (PDQ_RX_FC_OFFSET - PDQ_OS_HDR_OFFSET) - 4 /* CRC */;
781 segcnt = (pdulen + PDQ_OS_HDR_OFFSET + PDQ_OS_DATABUF_SIZE - 1) / PDQ_OS_DATABUF_SIZE;
782 PDQ_OS_DATABUF_ALLOC(pdq, npdu);
716 if (npdu == NULL) {
717 PDQ_PRINTF(("discard: no databuf #0\n"));
718 goto discard_frame;
719 }
720 buffers[completion] = npdu;
721 for (idx = 1; idx < segcnt; idx++) {
783 if (npdu == NULL) {
784 PDQ_PRINTF(("discard: no databuf #0\n"));
785 goto discard_frame;
786 }
787 buffers[completion] = npdu;
788 for (idx = 1; idx < segcnt; idx++) {
722 PDQ_OS_DATABUF_ALLOC(npdu);
789 PDQ_OS_DATABUF_ALLOC(pdq, npdu);
723 if (npdu == NULL) {
724 PDQ_OS_DATABUF_NEXT_SET(lpdu, NULL);
790 if (npdu == NULL) {
791 PDQ_OS_DATABUF_NEXT_SET(lpdu, NULL);
725 PDQ_OS_DATABUF_FREE(fpdu);
792 PDQ_OS_DATABUF_FREE(pdq, fpdu);
726 goto discard_frame;
727 }
728 PDQ_OS_DATABUF_NEXT_SET(lpdu, buffers[(completion + idx) & ring_mask]);
729 lpdu = PDQ_OS_DATABUF_NEXT(lpdu);
730 buffers[(completion + idx) & ring_mask] = npdu;
731 }
732 PDQ_OS_DATABUF_NEXT_SET(lpdu, NULL);
733 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
734 buffers[(producer + idx) & ring_mask] =
735 buffers[(completion + idx) & ring_mask];
736 buffers[(completion + idx) & ring_mask] = NULL;
737 }
793 goto discard_frame;
794 }
795 PDQ_OS_DATABUF_NEXT_SET(lpdu, buffers[(completion + idx) & ring_mask]);
796 lpdu = PDQ_OS_DATABUF_NEXT(lpdu);
797 buffers[(completion + idx) & ring_mask] = npdu;
798 }
799 PDQ_OS_DATABUF_NEXT_SET(lpdu, NULL);
800 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
801 buffers[(producer + idx) & ring_mask] =
802 buffers[(completion + idx) & ring_mask];
803 buffers[(completion + idx) & ring_mask] = NULL;
804 }
738 PDQ_OS_DATABUF_ADJ(fpdu, PDQ_RX_FC_OFFSET);
805 PDQ_OS_DATABUF_ADJ(fpdu, PDQ_OS_HDR_OFFSET);
739 if (segcnt == 1) {
740 PDQ_OS_DATABUF_LEN_SET(fpdu, pdulen);
741 } else {
806 if (segcnt == 1) {
807 PDQ_OS_DATABUF_LEN_SET(fpdu, pdulen);
808 } else {
742 PDQ_OS_DATABUF_LEN_SET(lpdu, pdulen + PDQ_RX_FC_OFFSET - (segcnt - 1) * PDQ_OS_DATABUF_SIZE);
809 PDQ_OS_DATABUF_LEN_SET(lpdu, pdulen + PDQ_OS_HDR_OFFSET - (segcnt - 1) * PDQ_OS_DATABUF_SIZE);
743 }
810 }
744 pdq_os_receive_pdu(pdq, fpdu, pdulen);
811 /*
812 * Do not pass to protocol if packet was received promiscuously
813 */
814 pdq_os_receive_pdu(pdq, fpdu, pdulen,
815 status.rxs_rcc_dd < PDQ_RXS_RCC_DD_CAM_MATCH);
745 rx->rx_free += PDQ_RX_SEGCNT;
746 PDQ_ADVANCE(producer, PDQ_RX_SEGCNT, ring_mask);
747 PDQ_ADVANCE(completion, PDQ_RX_SEGCNT, ring_mask);
748 continue;
749 } else {
750 PDQ_PRINTF(("discard: bad pdu 0x%x(%d.%d.%d.%d.%d)\n", status.rxs_status,
751 status.rxs_rcc_badpdu, status.rxs_rcc_badcrc,
752 status.rxs_rcc_reason, status.rxs_fsc, status.rxs_fsb_e));
753 if (status.rxs_rcc_reason == 7)
754 goto discard_frame;
755 if (status.rxs_rcc_reason != 0) {
756 /* hardware fault */
816 rx->rx_free += PDQ_RX_SEGCNT;
817 PDQ_ADVANCE(producer, PDQ_RX_SEGCNT, ring_mask);
818 PDQ_ADVANCE(completion, PDQ_RX_SEGCNT, ring_mask);
819 continue;
820 } else {
821 PDQ_PRINTF(("discard: bad pdu 0x%x(%d.%d.%d.%d.%d)\n", status.rxs_status,
822 status.rxs_rcc_badpdu, status.rxs_rcc_badcrc,
823 status.rxs_rcc_reason, status.rxs_fsc, status.rxs_fsb_e));
824 if (status.rxs_rcc_reason == 7)
825 goto discard_frame;
826 if (status.rxs_rcc_reason != 0) {
827 /* hardware fault */
828 if (status.rxs_rcc_badcrc) {
829 printf(PDQ_OS_PREFIX " MAC CRC error (source=%x-%x-%x-%x-%x-%x)\n",
830 PDQ_OS_PREFIX_ARGS,
831 dataptr[PDQ_RX_FC_OFFSET+1],
832 dataptr[PDQ_RX_FC_OFFSET+2],
833 dataptr[PDQ_RX_FC_OFFSET+3],
834 dataptr[PDQ_RX_FC_OFFSET+4],
835 dataptr[PDQ_RX_FC_OFFSET+5],
836 dataptr[PDQ_RX_FC_OFFSET+6]);
837 /* rx->rx_badcrc++; */
838 } else if (status.rxs_fsc == 0 || status.rxs_fsb_e == 1) {
839 /* rx->rx_frame_status_errors++; */
840 } else {
841 /* hardware fault */
842 }
757 }
843 }
758 if (status.rxs_rcc_badcrc) {
759 printf(PDQ_OS_PREFIX " MAC CRC error (source=%x-%x-%x-%x-%x-%x)\n",
760 PDQ_OS_PREFIX_ARGS,
761 dataptr[PDQ_RX_FC_OFFSET+1],
762 dataptr[PDQ_RX_FC_OFFSET+2],
763 dataptr[PDQ_RX_FC_OFFSET+3],
764 dataptr[PDQ_RX_FC_OFFSET+4],
765 dataptr[PDQ_RX_FC_OFFSET+5],
766 dataptr[PDQ_RX_FC_OFFSET+6]);
767 /* rx->rx_badcrc++; */
768 } else if (status.rxs_fsc == 0 || status.rxs_fsb_e == 1) {
769 /* rx->rx_frame_status_errors++; */
770 } else {
771 /* hardware fault */
772 }
773 }
774 discard_frame:
775 /*
776 * Discarded frames go right back on the queue; therefore
777 * ring entries were freed.
778 */
779 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
780 buffers[producer] = buffers[completion];
781 buffers[completion] = NULL;
782 rxd = &receives[rx->rx_producer];
783 if (idx == 0) {
784 rxd->rxd_sop = 1; rxd->rxd_seg_cnt = PDQ_RX_SEGCNT - 1;
785 } else {
786 rxd->rxd_sop = 0; rxd->rxd_seg_cnt = 0;
787 }
788 rxd->rxd_pa_hi = 0;
789 rxd->rxd_seg_len_hi = PDQ_OS_DATABUF_SIZE / 16;
844 }
845 discard_frame:
846 /*
847 * Discarded frames go right back on the queue; therefore
848 * ring entries were freed.
849 */
850 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
851 buffers[producer] = buffers[completion];
852 buffers[completion] = NULL;
853 rxd = &receives[rx->rx_producer];
854 if (idx == 0) {
855 rxd->rxd_sop = 1; rxd->rxd_seg_cnt = PDQ_RX_SEGCNT - 1;
856 } else {
857 rxd->rxd_sop = 0; rxd->rxd_seg_cnt = 0;
858 }
859 rxd->rxd_pa_hi = 0;
860 rxd->rxd_seg_len_hi = PDQ_OS_DATABUF_SIZE / 16;
790 rxd->rxd_pa_lo = PDQ_OS_VA_TO_PA(pdq, PDQ_OS_DATABUF_PTR(buffers[rx->rx_producer]));
861 rxd->rxd_pa_lo = PDQ_OS_DATABUF_BUSPA(pdq, buffers[rx->rx_producer]);
862 PDQ_OS_RXPDU_PRESYNC(pdq, buffers[rx->rx_producer], 0, PDQ_OS_DATABUF_SIZE);
863 PDQ_OS_DESC_PRESYNC(pdq, rxd, sizeof(*rxd));
791 PDQ_ADVANCE(rx->rx_producer, 1, ring_mask);
792 PDQ_ADVANCE(producer, 1, ring_mask);
793 PDQ_ADVANCE(completion, 1, ring_mask);
794 }
795 }
796 rx->rx_completion = completion;
797
798 while (rx->rx_free > PDQ_RX_SEGCNT && rx->rx_free > rx->rx_target) {
799 PDQ_OS_DATABUF_T *pdu;
800 /*
801 * Allocate the needed number of data buffers.
802 * Try to obtain them from our free queue before
803 * asking the system for more.
804 */
805 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
806 if ((pdu = buffers[(rx->rx_producer + idx) & ring_mask]) == NULL) {
864 PDQ_ADVANCE(rx->rx_producer, 1, ring_mask);
865 PDQ_ADVANCE(producer, 1, ring_mask);
866 PDQ_ADVANCE(completion, 1, ring_mask);
867 }
868 }
869 rx->rx_completion = completion;
870
871 while (rx->rx_free > PDQ_RX_SEGCNT && rx->rx_free > rx->rx_target) {
872 PDQ_OS_DATABUF_T *pdu;
873 /*
874 * Allocate the needed number of data buffers.
875 * Try to obtain them from our free queue before
876 * asking the system for more.
877 */
878 for (idx = 0; idx < PDQ_RX_SEGCNT; idx++) {
879 if ((pdu = buffers[(rx->rx_producer + idx) & ring_mask]) == NULL) {
807 PDQ_OS_DATABUF_ALLOC(pdu);
880 PDQ_OS_DATABUF_ALLOC(pdq, pdu);
808 if (pdu == NULL)
809 break;
810 buffers[(rx->rx_producer + idx) & ring_mask] = pdu;
811 }
812 rxd = &receives[(rx->rx_producer + idx) & ring_mask];
813 if (idx == 0) {
814 rxd->rxd_sop = 1; rxd->rxd_seg_cnt = PDQ_RX_SEGCNT - 1;
815 } else {
816 rxd->rxd_sop = 0; rxd->rxd_seg_cnt = 0;
817 }
818 rxd->rxd_pa_hi = 0;
819 rxd->rxd_seg_len_hi = PDQ_OS_DATABUF_SIZE / 16;
881 if (pdu == NULL)
882 break;
883 buffers[(rx->rx_producer + idx) & ring_mask] = pdu;
884 }
885 rxd = &receives[(rx->rx_producer + idx) & ring_mask];
886 if (idx == 0) {
887 rxd->rxd_sop = 1; rxd->rxd_seg_cnt = PDQ_RX_SEGCNT - 1;
888 } else {
889 rxd->rxd_sop = 0; rxd->rxd_seg_cnt = 0;
890 }
891 rxd->rxd_pa_hi = 0;
892 rxd->rxd_seg_len_hi = PDQ_OS_DATABUF_SIZE / 16;
820 rxd->rxd_pa_lo = PDQ_OS_VA_TO_PA(pdq, PDQ_OS_DATABUF_PTR(pdu));
893 rxd->rxd_pa_lo = PDQ_OS_DATABUF_BUSPA(pdq, pdu);
894 PDQ_OS_RXPDU_PRESYNC(pdq, pdu, 0, PDQ_OS_DATABUF_SIZE);
895 PDQ_OS_DESC_PRESYNC(pdq, rxd, sizeof(*rxd));
821 }
822 if (idx < PDQ_RX_SEGCNT) {
823 /*
824 * We didn't get all databufs required to complete a new
825 * receive buffer. Keep the ones we got and retry a bit
826 * later for the rest.
827 */
828 break;
829 }
830 PDQ_ADVANCE(rx->rx_producer, PDQ_RX_SEGCNT, ring_mask);
831 rx->rx_free -= PDQ_RX_SEGCNT;
832 }
833}
834
896 }
897 if (idx < PDQ_RX_SEGCNT) {
898 /*
899 * We didn't get all databufs required to complete a new
900 * receive buffer. Keep the ones we got and retry a bit
901 * later for the rest.
902 */
903 break;
904 }
905 PDQ_ADVANCE(rx->rx_producer, PDQ_RX_SEGCNT, ring_mask);
906 rx->rx_free -= PDQ_RX_SEGCNT;
907 }
908}
909
910static void pdq_process_transmitted_data(pdq_t *pdq);
911
835pdq_boolean_t
836pdq_queue_transmit_data(
837 pdq_t *pdq,
838 PDQ_OS_DATABUF_T *pdu)
839{
912pdq_boolean_t
913pdq_queue_transmit_data(
914 pdq_t *pdq,
915 PDQ_OS_DATABUF_T *pdu)
916{
840 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
841 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
917 pdq_tx_info_t * const tx = &pdq->pdq_tx_info;
918 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
842 pdq_uint32_t producer = tx->tx_producer;
843 pdq_txdesc_t *eop = NULL;
844 PDQ_OS_DATABUF_T *pdu0;
845 pdq_uint32_t freecnt;
919 pdq_uint32_t producer = tx->tx_producer;
920 pdq_txdesc_t *eop = NULL;
921 PDQ_OS_DATABUF_T *pdu0;
922 pdq_uint32_t freecnt;
923#if defined(PDQ_BUS_DMA)
924 bus_dmamap_t map;
925#endif
846
926
847 if (tx->tx_free < 1)
927 again:
928 if (PDQ_RX_FC_OFFSET == PDQ_OS_HDR_OFFSET) {
929 freecnt = tx->tx_free - 1;
930 } else {
931 freecnt = tx->tx_free;
932 }
933 /*
934 * Need 2 or more descriptors to be able to send.
935 */
936 if (freecnt == 0) {
937 pdq->pdq_intrmask |= PDQ_HOST_INT_TX_ENABLE;
938 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
848 return PDQ_FALSE;
939 return PDQ_FALSE;
940 }
849
941
850 dbp->pdqdb_transmits[producer] = tx->tx_hdrdesc;
851 PDQ_ADVANCE(producer, 1, PDQ_RING_MASK(dbp->pdqdb_transmits));
942 if (PDQ_RX_FC_OFFSET == PDQ_OS_HDR_OFFSET) {
943 dbp->pdqdb_transmits[producer] = tx->tx_hdrdesc;
944 PDQ_OS_DESC_PRESYNC(pdq, &dbp->pdqdb_transmits[producer], sizeof(pdq_txdesc_t));
945 PDQ_ADVANCE(producer, 1, PDQ_RING_MASK(dbp->pdqdb_transmits));
946 }
852
947
948#if defined(PDQ_BUS_DMA)
949 map = M_GETCTX(pdu, bus_dmamap_t);
950 if (freecnt >= map->dm_nsegs) {
951 int idx;
952 for (idx = 0; idx < map->dm_nsegs; idx++) {
953 /*
954 * Initialize the transmit descriptor
955 */
956 eop = &dbp->pdqdb_transmits[producer];
957 eop->txd_seg_len = map->dm_segs[idx].ds_len;
958 eop->txd_pa_lo = map->dm_segs[idx].ds_addr;
959 eop->txd_sop = eop->txd_eop = eop->txd_pa_hi = 0;
960 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
961 freecnt--;
962 PDQ_ADVANCE(producer, 1, PDQ_RING_MASK(dbp->pdqdb_transmits));
963 }
964 pdu0 = NULL;
965 } else {
966 pdu0 = pdu;
967 }
968#else
853 for (freecnt = tx->tx_free - 1, pdu0 = pdu; pdu0 != NULL && freecnt > 0;) {
854 pdq_uint32_t fraglen, datalen = PDQ_OS_DATABUF_LEN(pdu0);
855 const pdq_uint8_t *dataptr = PDQ_OS_DATABUF_PTR(pdu0);
856
857 /*
858 * The first segment is limited to the space remaining in
859 * page. All segments after that can be up to a full page
860 * in size.
861 */
862 fraglen = PDQ_OS_PAGESIZE - ((dataptr - (pdq_uint8_t *) NULL) & (PDQ_OS_PAGESIZE-1));
863 while (datalen > 0 && freecnt > 0) {
864 pdq_uint32_t seglen = (fraglen < datalen ? fraglen : datalen);
865
866 /*
867 * Initialize the transmit descriptor
868 */
869 eop = &dbp->pdqdb_transmits[producer];
870 eop->txd_seg_len = seglen;
969 for (freecnt = tx->tx_free - 1, pdu0 = pdu; pdu0 != NULL && freecnt > 0;) {
970 pdq_uint32_t fraglen, datalen = PDQ_OS_DATABUF_LEN(pdu0);
971 const pdq_uint8_t *dataptr = PDQ_OS_DATABUF_PTR(pdu0);
972
973 /*
974 * The first segment is limited to the space remaining in
975 * page. All segments after that can be up to a full page
976 * in size.
977 */
978 fraglen = PDQ_OS_PAGESIZE - ((dataptr - (pdq_uint8_t *) NULL) & (PDQ_OS_PAGESIZE-1));
979 while (datalen > 0 && freecnt > 0) {
980 pdq_uint32_t seglen = (fraglen < datalen ? fraglen : datalen);
981
982 /*
983 * Initialize the transmit descriptor
984 */
985 eop = &dbp->pdqdb_transmits[producer];
986 eop->txd_seg_len = seglen;
871 eop->txd_pa_lo = PDQ_OS_VA_TO_PA(pdq, dataptr);
987 eop->txd_pa_lo = PDQ_OS_VA_TO_BUSPA(pdq, dataptr);
872 eop->txd_sop = eop->txd_eop = eop->txd_pa_hi = 0;
988 eop->txd_sop = eop->txd_eop = eop->txd_pa_hi = 0;
873
989 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
874 datalen -= seglen;
875 dataptr += seglen;
876 fraglen = PDQ_OS_PAGESIZE;
877 freecnt--;
878 PDQ_ADVANCE(producer, 1, PDQ_RING_MASK(dbp->pdqdb_transmits));
879 }
880 pdu0 = PDQ_OS_DATABUF_NEXT(pdu0);
881 }
990 datalen -= seglen;
991 dataptr += seglen;
992 fraglen = PDQ_OS_PAGESIZE;
993 freecnt--;
994 PDQ_ADVANCE(producer, 1, PDQ_RING_MASK(dbp->pdqdb_transmits));
995 }
996 pdu0 = PDQ_OS_DATABUF_NEXT(pdu0);
997 }
998#endif /* defined(PDQ_BUS_DMA) */
882 if (pdu0 != NULL) {
999 if (pdu0 != NULL) {
1000 unsigned completion = tx->tx_completion;
883 PDQ_ASSERT(freecnt == 0);
1001 PDQ_ASSERT(freecnt == 0);
1002 PDQ_OS_CONSUMER_POSTSYNC(pdq);
1003 pdq_process_transmitted_data(pdq);
1004 if (completion != tx->tx_completion) {
1005 producer = tx->tx_producer;
1006 eop = NULL;
1007 goto again;
1008 }
884 /*
885 * If we still have data to process then the ring was too full
886 * to store the PDU. Return FALSE so the caller will requeue
887 * the PDU for later.
888 */
1009 /*
1010 * If we still have data to process then the ring was too full
1011 * to store the PDU. Return FALSE so the caller will requeue
1012 * the PDU for later.
1013 */
1014 pdq->pdq_intrmask |= PDQ_HOST_INT_TX_ENABLE;
1015 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
889 return PDQ_FALSE;
890 }
891 /*
892 * Everything went fine. Finish it up.
893 */
894 tx->tx_descriptor_count[tx->tx_producer] = tx->tx_free - freecnt;
1016 return PDQ_FALSE;
1017 }
1018 /*
1019 * Everything went fine. Finish it up.
1020 */
1021 tx->tx_descriptor_count[tx->tx_producer] = tx->tx_free - freecnt;
1022 if (PDQ_RX_FC_OFFSET != PDQ_OS_HDR_OFFSET) {
1023 dbp->pdqdb_transmits[tx->tx_producer].txd_sop = 1;
1024 PDQ_OS_DESC_PRESYNC(pdq, &dbp->pdqdb_transmits[tx->tx_producer],
1025 sizeof(pdq_txdesc_t));
1026 }
895 eop->txd_eop = 1;
1027 eop->txd_eop = 1;
1028 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
896 PDQ_OS_DATABUF_ENQUEUE(&tx->tx_txq, pdu);
897 tx->tx_producer = producer;
898 tx->tx_free = freecnt;
899 PDQ_DO_TYPE2_PRODUCER(pdq);
900 return PDQ_TRUE;
901}
902
903static void
904pdq_process_transmitted_data(
905 pdq_t *pdq)
906{
907 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
908 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
909 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
910 pdq_uint32_t completion = tx->tx_completion;
1029 PDQ_OS_DATABUF_ENQUEUE(&tx->tx_txq, pdu);
1030 tx->tx_producer = producer;
1031 tx->tx_free = freecnt;
1032 PDQ_DO_TYPE2_PRODUCER(pdq);
1033 return PDQ_TRUE;
1034}
1035
1036static void
1037pdq_process_transmitted_data(
1038 pdq_t *pdq)
1039{
1040 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
1041 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
1042 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
1043 pdq_uint32_t completion = tx->tx_completion;
1044 int reclaimed = 0;
911
912 while (completion != cbp->pdqcb_transmits) {
913 PDQ_OS_DATABUF_T *pdu;
914 pdq_uint32_t descriptor_count = tx->tx_descriptor_count[completion];
915 PDQ_ASSERT(dbp->pdqdb_transmits[completion].txd_sop == 1);
916 PDQ_ASSERT(dbp->pdqdb_transmits[(completion + descriptor_count - 1) & PDQ_RING_MASK(dbp->pdqdb_transmits)].txd_eop == 1);
917 PDQ_OS_DATABUF_DEQUEUE(&tx->tx_txq, pdu);
918 pdq_os_transmit_done(pdq, pdu);
919 tx->tx_free += descriptor_count;
1045
1046 while (completion != cbp->pdqcb_transmits) {
1047 PDQ_OS_DATABUF_T *pdu;
1048 pdq_uint32_t descriptor_count = tx->tx_descriptor_count[completion];
1049 PDQ_ASSERT(dbp->pdqdb_transmits[completion].txd_sop == 1);
1050 PDQ_ASSERT(dbp->pdqdb_transmits[(completion + descriptor_count - 1) & PDQ_RING_MASK(dbp->pdqdb_transmits)].txd_eop == 1);
1051 PDQ_OS_DATABUF_DEQUEUE(&tx->tx_txq, pdu);
1052 pdq_os_transmit_done(pdq, pdu);
1053 tx->tx_free += descriptor_count;
920
1054 reclaimed = 1;
921 PDQ_ADVANCE(completion, descriptor_count, PDQ_RING_MASK(dbp->pdqdb_transmits));
922 }
923 if (tx->tx_completion != completion) {
924 tx->tx_completion = completion;
1055 PDQ_ADVANCE(completion, descriptor_count, PDQ_RING_MASK(dbp->pdqdb_transmits));
1056 }
1057 if (tx->tx_completion != completion) {
1058 tx->tx_completion = completion;
1059 pdq->pdq_intrmask &= ~PDQ_HOST_INT_TX_ENABLE;
1060 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
925 pdq_os_restart_transmitter(pdq);
926 }
1061 pdq_os_restart_transmitter(pdq);
1062 }
927 PDQ_DO_TYPE2_PRODUCER(pdq);
1063 if (reclaimed)
1064 PDQ_DO_TYPE2_PRODUCER(pdq);
928}
929
930void
931pdq_flush_transmitter(
932 pdq_t *pdq)
933{
934 volatile pdq_consumer_block_t *cbp = pdq->pdq_cbp;
935 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
936
937 for (;;) {
938 PDQ_OS_DATABUF_T *pdu;
939 PDQ_OS_DATABUF_DEQUEUE(&tx->tx_txq, pdu);
940 if (pdu == NULL)
941 break;
942 /*
943 * Don't call transmit done since the packet never made it
944 * out on the wire.
945 */
1065}
1066
1067void
1068pdq_flush_transmitter(
1069 pdq_t *pdq)
1070{
1071 volatile pdq_consumer_block_t *cbp = pdq->pdq_cbp;
1072 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
1073
1074 for (;;) {
1075 PDQ_OS_DATABUF_T *pdu;
1076 PDQ_OS_DATABUF_DEQUEUE(&tx->tx_txq, pdu);
1077 if (pdu == NULL)
1078 break;
1079 /*
1080 * Don't call transmit done since the packet never made it
1081 * out on the wire.
1082 */
946 PDQ_OS_DATABUF_FREE(pdu);
1083 PDQ_OS_DATABUF_FREE(pdq, pdu);
947 }
948
949 tx->tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
1084 }
1085
1086 tx->tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
950 tx->tx_completion = cbp->pdqcb_transmits = tx->tx_producer;
1087 cbp->pdqcb_transmits = tx->tx_completion = tx->tx_producer;
1088 PDQ_OS_CONSUMER_PRESYNC(pdq);
951
952 PDQ_DO_TYPE2_PRODUCER(pdq);
953}
954
955void
956pdq_hwreset(
957 pdq_t *pdq)
958{
959 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
960 pdq_state_t state;
961 int cnt;
962
963 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
964 if (state == PDQS_DMA_UNAVAILABLE)
965 return;
966 PDQ_CSR_WRITE(csrs, csr_port_data_a,
1089
1090 PDQ_DO_TYPE2_PRODUCER(pdq);
1091}
1092
1093void
1094pdq_hwreset(
1095 pdq_t *pdq)
1096{
1097 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
1098 pdq_state_t state;
1099 int cnt;
1100
1101 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1102 if (state == PDQS_DMA_UNAVAILABLE)
1103 return;
1104 PDQ_CSR_WRITE(csrs, csr_port_data_a,
967 (state == PDQS_HALTED) ? 0 : PDQ_PRESET_SKIP_SELFTEST);
1105 (state == PDQS_HALTED && pdq->pdq_type != PDQ_DEFTA) ? 0 : PDQ_PRESET_SKIP_SELFTEST);
968 PDQ_CSR_WRITE(csrs, csr_port_reset, 1);
969 PDQ_OS_USEC_DELAY(100);
970 PDQ_CSR_WRITE(csrs, csr_port_reset, 0);
1106 PDQ_CSR_WRITE(csrs, csr_port_reset, 1);
1107 PDQ_OS_USEC_DELAY(100);
1108 PDQ_CSR_WRITE(csrs, csr_port_reset, 0);
971 for (cnt = 45000;;cnt--) {
1109 for (cnt = 100000;;cnt--) {
972 PDQ_OS_USEC_DELAY(1000);
973 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
974 if (state == PDQS_DMA_UNAVAILABLE || cnt == 0)
975 break;
976 }
1110 PDQ_OS_USEC_DELAY(1000);
1111 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1112 if (state == PDQS_DMA_UNAVAILABLE || cnt == 0)
1113 break;
1114 }
977 PDQ_PRINTF(("PDQ Reset spun %d cycles\n", 45000 - cnt));
1115 PDQ_PRINTF(("PDQ Reset spun %d cycles\n", 100000 - cnt));
978 PDQ_OS_USEC_DELAY(10000);
979 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
980 PDQ_ASSERT(state == PDQS_DMA_UNAVAILABLE);
981 PDQ_ASSERT(cnt > 0);
982}
983
984/*
985 * The following routine brings the PDQ from whatever state it is

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

1045 */
1046 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_mode_control, 0);
1047 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x10);
1048 }
1049
1050 /*
1051 * Flush all the databuf queues.
1052 */
1116 PDQ_OS_USEC_DELAY(10000);
1117 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1118 PDQ_ASSERT(state == PDQS_DMA_UNAVAILABLE);
1119 PDQ_ASSERT(cnt > 0);
1120}
1121
1122/*
1123 * The following routine brings the PDQ from whatever state it is

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

1183 */
1184 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_mode_control, 0);
1185 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x10);
1186 }
1187
1188 /*
1189 * Flush all the databuf queues.
1190 */
1053 pdq_flush_databuf_queue(&pdq->pdq_tx_info.tx_txq);
1054 pdq->pdq_flags &= ~PDQ_TXOK;
1191 pdq_flush_databuf_queue(pdq, &pdq->pdq_tx_info.tx_txq);
1192 pdq->pdq_flags &= ~(PDQ_TXOK|PDQ_IS_ONRING|PDQ_IS_FDX);
1055 buffers = (PDQ_OS_DATABUF_T **) pdq->pdq_rx_info.rx_buffers;
1056 for (idx = 0; idx < PDQ_RING_SIZE(pdq->pdq_dbp->pdqdb_receives); idx++) {
1057 if (buffers[idx] != NULL) {
1193 buffers = (PDQ_OS_DATABUF_T **) pdq->pdq_rx_info.rx_buffers;
1194 for (idx = 0; idx < PDQ_RING_SIZE(pdq->pdq_dbp->pdqdb_receives); idx++) {
1195 if (buffers[idx] != NULL) {
1058 PDQ_OS_DATABUF_FREE(buffers[idx]);
1196 PDQ_OS_DATABUF_FREE(pdq, buffers[idx]);
1059 buffers[idx] = NULL;
1060 }
1061 }
1062 pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives);
1063 buffers = (PDQ_OS_DATABUF_T **) pdq->pdq_host_smt_info.rx_buffers;
1064 for (idx = 0; idx < PDQ_RING_SIZE(pdq->pdq_dbp->pdqdb_host_smt); idx++) {
1065 if (buffers[idx] != NULL) {
1197 buffers[idx] = NULL;
1198 }
1199 }
1200 pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives);
1201 buffers = (PDQ_OS_DATABUF_T **) pdq->pdq_host_smt_info.rx_buffers;
1202 for (idx = 0; idx < PDQ_RING_SIZE(pdq->pdq_dbp->pdqdb_host_smt); idx++) {
1203 if (buffers[idx] != NULL) {
1066 PDQ_OS_DATABUF_FREE(buffers[idx]);
1204 PDQ_OS_DATABUF_FREE(pdq, buffers[idx]);
1067 buffers[idx] = NULL;
1068 }
1069 }
1070 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt);
1071
1072 /*
1073 * Reset the consumer indexes to 0.
1074 */
1075 pdq->pdq_cbp->pdqcb_receives = 0;
1076 pdq->pdq_cbp->pdqcb_transmits = 0;
1077 pdq->pdq_cbp->pdqcb_host_smt = 0;
1078 pdq->pdq_cbp->pdqcb_unsolicited_event = 0;
1079 pdq->pdq_cbp->pdqcb_command_response = 0;
1080 pdq->pdq_cbp->pdqcb_command_request = 0;
1205 buffers[idx] = NULL;
1206 }
1207 }
1208 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt);
1209
1210 /*
1211 * Reset the consumer indexes to 0.
1212 */
1213 pdq->pdq_cbp->pdqcb_receives = 0;
1214 pdq->pdq_cbp->pdqcb_transmits = 0;
1215 pdq->pdq_cbp->pdqcb_host_smt = 0;
1216 pdq->pdq_cbp->pdqcb_unsolicited_event = 0;
1217 pdq->pdq_cbp->pdqcb_command_response = 0;
1218 pdq->pdq_cbp->pdqcb_command_request = 0;
1219 PDQ_OS_CONSUMER_PRESYNC(pdq);
1081
1082 /*
1083 * Reset the producer and completion indexes to 0.
1084 */
1085 pdq->pdq_command_info.ci_request_producer = 0;
1086 pdq->pdq_command_info.ci_response_producer = 0;
1087 pdq->pdq_command_info.ci_request_completion = 0;
1088 pdq->pdq_command_info.ci_response_completion = 0;

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

1114#endif
1115 }
1116
1117 /*
1118 * Make sure the unsolicited queue has events ...
1119 */
1120 pdq_process_unsolicited_events(pdq);
1121
1220
1221 /*
1222 * Reset the producer and completion indexes to 0.
1223 */
1224 pdq->pdq_command_info.ci_request_producer = 0;
1225 pdq->pdq_command_info.ci_response_producer = 0;
1226 pdq->pdq_command_info.ci_request_completion = 0;
1227 pdq->pdq_command_info.ci_response_completion = 0;

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

1253#endif
1254 }
1255
1256 /*
1257 * Make sure the unsolicited queue has events ...
1258 */
1259 pdq_process_unsolicited_events(pdq);
1260
1122 if (pdq->pdq_type == PDQ_DEFEA && pdq->pdq_chip_rev == PDQ_CHIP_REV_E)
1261 if ((pdq->pdq_type == PDQ_DEFEA && pdq->pdq_chip_rev == PDQ_CHIP_REV_E)
1262 || pdq->pdq_type == PDQ_DEFTA)
1123 PDQ_CSR_WRITE(csrs, csr_port_data_b, PDQ_DMA_BURST_16LW);
1124 else
1125 PDQ_CSR_WRITE(csrs, csr_port_data_b, PDQ_DMA_BURST_8LW);
1126 PDQ_CSR_WRITE(csrs, csr_port_data_a, PDQ_SUB_CMD_DMA_BURST_SIZE_SET);
1127 pdq_do_port_control(csrs, PDQ_PCTL_SUB_CMD);
1128
1263 PDQ_CSR_WRITE(csrs, csr_port_data_b, PDQ_DMA_BURST_16LW);
1264 else
1265 PDQ_CSR_WRITE(csrs, csr_port_data_b, PDQ_DMA_BURST_8LW);
1266 PDQ_CSR_WRITE(csrs, csr_port_data_a, PDQ_SUB_CMD_DMA_BURST_SIZE_SET);
1267 pdq_do_port_control(csrs, PDQ_PCTL_SUB_CMD);
1268
1269 /*
1270 * Make sure there isn't stale information in the caches before
1271 * tell the adapter about the blocks it's going to use.
1272 */
1273 PDQ_OS_CONSUMER_PRESYNC(pdq);
1274
1129 PDQ_CSR_WRITE(csrs, csr_port_data_b, 0);
1275 PDQ_CSR_WRITE(csrs, csr_port_data_b, 0);
1130 PDQ_CSR_WRITE(csrs, csr_port_data_a, PDQ_OS_VA_TO_PA(pdq, pdq->pdq_cbp));
1276 PDQ_CSR_WRITE(csrs, csr_port_data_a, pdq->pdq_pa_consumer_block);
1131 pdq_do_port_control(csrs, PDQ_PCTL_CONSUMER_BLOCK);
1132
1133 PDQ_CSR_WRITE(csrs, csr_port_data_b, 0);
1277 pdq_do_port_control(csrs, PDQ_PCTL_CONSUMER_BLOCK);
1278
1279 PDQ_CSR_WRITE(csrs, csr_port_data_b, 0);
1134 PDQ_CSR_WRITE(csrs, csr_port_data_a,
1135 PDQ_OS_VA_TO_PA(pdq, pdq->pdq_dbp) | PDQ_DMA_INIT_LW_BSWAP_DATA);
1280#if !defined(BYTE_ORDER) || BYTE_ORDER == LITTLE_ENDIAN
1281 PDQ_CSR_WRITE(csrs, csr_port_data_a, pdq->pdq_pa_descriptor_block | PDQ_DMA_INIT_LW_BSWAP_DATA);
1282#else
1283 PDQ_CSR_WRITE(csrs, csr_port_data_a, pdq->pdq_pa_descriptor_block | PDQ_DMA_INIT_LW_BSWAP_DATA | PDQ_DMA_INIT_LW_BSWAP_LITERAL);
1284#endif
1136 pdq_do_port_control(csrs, PDQ_PCTL_DMA_INIT);
1137
1138 for (cnt = 0; cnt < 1000; cnt++) {
1139 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1140 if (state == PDQS_HALTED) {
1141 if (pass > 0)
1142 return PDQS_HALTED;
1143 pass = 1;
1144 goto restart;
1145 }
1146 if (state == PDQS_DMA_AVAILABLE) {
1147 PDQ_PRINTF(("Transition to DMA Available took %d spins\n", cnt));
1148 break;
1149 }
1150 PDQ_OS_USEC_DELAY(1000);
1151 }
1152 PDQ_ASSERT(state == PDQS_DMA_AVAILABLE);
1153
1154 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, 0xFF);
1285 pdq_do_port_control(csrs, PDQ_PCTL_DMA_INIT);
1286
1287 for (cnt = 0; cnt < 1000; cnt++) {
1288 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1289 if (state == PDQS_HALTED) {
1290 if (pass > 0)
1291 return PDQS_HALTED;
1292 pass = 1;
1293 goto restart;
1294 }
1295 if (state == PDQS_DMA_AVAILABLE) {
1296 PDQ_PRINTF(("Transition to DMA Available took %d spins\n", cnt));
1297 break;
1298 }
1299 PDQ_OS_USEC_DELAY(1000);
1300 }
1301 PDQ_ASSERT(state == PDQS_DMA_AVAILABLE);
1302
1303 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, 0xFF);
1155 PDQ_CSR_WRITE(csrs, csr_host_int_enable, 0) /* PDQ_HOST_INT_STATE_CHANGE
1304 pdq->pdq_intrmask = 0;
1305 /* PDQ_HOST_INT_STATE_CHANGE
1156 |PDQ_HOST_INT_FATAL_ERROR|PDQ_HOST_INT_CMD_RSP_ENABLE
1157 |PDQ_HOST_INT_UNSOL_ENABLE */;
1306 |PDQ_HOST_INT_FATAL_ERROR|PDQ_HOST_INT_CMD_RSP_ENABLE
1307 |PDQ_HOST_INT_UNSOL_ENABLE */;
1308 PDQ_CSR_WRITE(csrs, csr_host_int_enable, pdq->pdq_intrmask);
1158
1159 /*
1160 * Any other command but START should be valid.
1161 */
1162 pdq->pdq_command_info.ci_pending_commands &= ~(PDQ_BITMASK(PDQC_START));
1163 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1164 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1165 pdq_queue_commands(pdq);
1166
1167 if (pdq->pdq_flags & PDQ_PRINTCHARS) {
1168 /*
1169 * Now wait (up to 100ms) for the command(s) to finish.
1170 */
1171 for (cnt = 0; cnt < 1000; cnt++) {
1309
1310 /*
1311 * Any other command but START should be valid.
1312 */
1313 pdq->pdq_command_info.ci_pending_commands &= ~(PDQ_BITMASK(PDQC_START));
1314 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1315 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1316 pdq_queue_commands(pdq);
1317
1318 if (pdq->pdq_flags & PDQ_PRINTCHARS) {
1319 /*
1320 * Now wait (up to 100ms) for the command(s) to finish.
1321 */
1322 for (cnt = 0; cnt < 1000; cnt++) {
1323 PDQ_OS_CONSUMER_POSTSYNC(pdq);
1172 pdq_process_command_responses(pdq);
1173 if (pdq->pdq_command_info.ci_response_producer == pdq->pdq_command_info.ci_response_completion)
1174 break;
1175 PDQ_OS_USEC_DELAY(1000);
1176 }
1177 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1178 }
1179

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

1196 switch (state) {
1197 case PDQS_DMA_AVAILABLE: {
1198 /*
1199 * The PDQ after being reset screws up some of its state.
1200 * So we need to clear all the errors/interrupts so the real
1201 * ones will get through.
1202 */
1203 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, 0xFF);
1324 pdq_process_command_responses(pdq);
1325 if (pdq->pdq_command_info.ci_response_producer == pdq->pdq_command_info.ci_response_completion)
1326 break;
1327 PDQ_OS_USEC_DELAY(1000);
1328 }
1329 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1330 }
1331

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

1348 switch (state) {
1349 case PDQS_DMA_AVAILABLE: {
1350 /*
1351 * The PDQ after being reset screws up some of its state.
1352 * So we need to clear all the errors/interrupts so the real
1353 * ones will get through.
1354 */
1355 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, 0xFF);
1204 PDQ_CSR_WRITE(csrs, csr_host_int_enable, PDQ_HOST_INT_STATE_CHANGE|PDQ_HOST_INT_XMT_DATA_FLUSH
1205 |PDQ_HOST_INT_FATAL_ERROR|PDQ_HOST_INT_CMD_RSP_ENABLE|PDQ_HOST_INT_UNSOL_ENABLE
1206 |PDQ_HOST_INT_RX_ENABLE|PDQ_HOST_INT_TX_ENABLE|PDQ_HOST_INT_HOST_SMT_ENABLE);
1356 pdq->pdq_intrmask = PDQ_HOST_INT_STATE_CHANGE
1357 |PDQ_HOST_INT_XMT_DATA_FLUSH|PDQ_HOST_INT_FATAL_ERROR
1358 |PDQ_HOST_INT_CMD_RSP_ENABLE|PDQ_HOST_INT_UNSOL_ENABLE
1359 |PDQ_HOST_INT_RX_ENABLE|PDQ_HOST_INT_HOST_SMT_ENABLE;
1360 PDQ_CSR_WRITE(csrs, csr_host_int_enable, pdq->pdq_intrmask);
1207 /*
1208 * Set the MAC and address filters and start up the PDQ.
1209 */
1210 pdq_process_unsolicited_events(pdq);
1211 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1212 pdq->pdq_dbp->pdqdb_receives,
1213 pdq->pdq_cbp->pdqcb_receives,
1214 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1215 PDQ_DO_TYPE2_PRODUCER(pdq);
1216 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1217 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1218 pdq->pdq_dbp->pdqdb_host_smt,
1219 pdq->pdq_cbp->pdqcb_host_smt,
1220 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1221 PDQ_CSR_WRITE(csrs, csr_host_smt_producer,
1222 pdq->pdq_host_smt_info.rx_producer
1223 | (pdq->pdq_host_smt_info.rx_completion << 8));
1224 }
1225 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1361 /*
1362 * Set the MAC and address filters and start up the PDQ.
1363 */
1364 pdq_process_unsolicited_events(pdq);
1365 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1366 pdq->pdq_dbp->pdqdb_receives,
1367 pdq->pdq_cbp->pdqcb_receives,
1368 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1369 PDQ_DO_TYPE2_PRODUCER(pdq);
1370 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1371 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1372 pdq->pdq_dbp->pdqdb_host_smt,
1373 pdq->pdq_cbp->pdqcb_host_smt,
1374 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1375 PDQ_CSR_WRITE(csrs, csr_host_smt_producer,
1376 pdq->pdq_host_smt_info.rx_producer
1377 | (pdq->pdq_host_smt_info.rx_completion << 8));
1378 }
1379 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1226 | PDQ_BITMASK(PDQC_ADDR_FILTER_SET) | PDQ_BITMASK(PDQC_START);
1380 | PDQ_BITMASK(PDQC_ADDR_FILTER_SET)
1381 | PDQ_BITMASK(PDQC_SNMP_SET)
1382 | PDQ_BITMASK(PDQC_START);
1227 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1228 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1229 pdq_queue_commands(pdq);
1230 break;
1231 }
1232 case PDQS_LINK_UNAVAILABLE:
1233 case PDQS_LINK_AVAILABLE: {
1234 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1383 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1384 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1385 pdq_queue_commands(pdq);
1386 break;
1387 }
1388 case PDQS_LINK_UNAVAILABLE:
1389 case PDQS_LINK_AVAILABLE: {
1390 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1235 | PDQ_BITMASK(PDQC_ADDR_FILTER_SET);
1391 | PDQ_BITMASK(PDQC_ADDR_FILTER_SET)
1392 | PDQ_BITMASK(PDQC_SNMP_SET);
1236 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1237 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1238 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1239 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1240 pdq->pdq_dbp->pdqdb_host_smt,
1241 pdq->pdq_cbp->pdqcb_host_smt,
1242 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1243 PDQ_CSR_WRITE(csrs, csr_host_smt_producer,

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

1265 int progress = 0;
1266
1267 if (pdq->pdq_type == PDQ_DEFPA)
1268 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x18);
1269
1270 while ((data = PDQ_CSR_READ(csrs, csr_port_status)) & PDQ_PSTS_INTR_PENDING) {
1271 progress = 1;
1272 PDQ_PRINTF(("PDQ Interrupt: Status = 0x%08x\n", data));
1393 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1394 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1395 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1396 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1397 pdq->pdq_dbp->pdqdb_host_smt,
1398 pdq->pdq_cbp->pdqcb_host_smt,
1399 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1400 PDQ_CSR_WRITE(csrs, csr_host_smt_producer,

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

1422 int progress = 0;
1423
1424 if (pdq->pdq_type == PDQ_DEFPA)
1425 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x18);
1426
1427 while ((data = PDQ_CSR_READ(csrs, csr_port_status)) & PDQ_PSTS_INTR_PENDING) {
1428 progress = 1;
1429 PDQ_PRINTF(("PDQ Interrupt: Status = 0x%08x\n", data));
1430 PDQ_OS_CONSUMER_POSTSYNC(pdq);
1273 if (data & PDQ_PSTS_RCV_DATA_PENDING) {
1274 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1275 pdq->pdq_dbp->pdqdb_receives,
1276 pdq->pdq_cbp->pdqcb_receives,
1277 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1278 PDQ_DO_TYPE2_PRODUCER(pdq);
1279 }
1280 if (data & PDQ_PSTS_HOST_SMT_PENDING) {
1281 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1282 pdq->pdq_dbp->pdqdb_host_smt,
1283 pdq->pdq_cbp->pdqcb_host_smt,
1284 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1285 PDQ_DO_HOST_SMT_PRODUCER(pdq);
1286 }
1431 if (data & PDQ_PSTS_RCV_DATA_PENDING) {
1432 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1433 pdq->pdq_dbp->pdqdb_receives,
1434 pdq->pdq_cbp->pdqcb_receives,
1435 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1436 PDQ_DO_TYPE2_PRODUCER(pdq);
1437 }
1438 if (data & PDQ_PSTS_HOST_SMT_PENDING) {
1439 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1440 pdq->pdq_dbp->pdqdb_host_smt,
1441 pdq->pdq_cbp->pdqcb_host_smt,
1442 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1443 PDQ_DO_HOST_SMT_PRODUCER(pdq);
1444 }
1287 if (data & PDQ_PSTS_XMT_DATA_PENDING)
1445 /* if (data & PDQ_PSTS_XMT_DATA_PENDING) */
1288 pdq_process_transmitted_data(pdq);
1289 if (data & PDQ_PSTS_UNSOL_PENDING)
1290 pdq_process_unsolicited_events(pdq);
1291 if (data & PDQ_PSTS_CMD_RSP_PENDING)
1292 pdq_process_command_responses(pdq);
1293 if (data & PDQ_PSTS_TYPE_0_PENDING) {
1294 data = PDQ_CSR_READ(csrs, csr_host_int_type_0);
1295 if (data & PDQ_HOST_INT_STATE_CHANGE) {
1296 pdq_state_t state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1297 printf(PDQ_OS_PREFIX "%s", PDQ_OS_PREFIX_ARGS, pdq_adapter_states[state]);
1298 if (state == PDQS_LINK_UNAVAILABLE) {
1446 pdq_process_transmitted_data(pdq);
1447 if (data & PDQ_PSTS_UNSOL_PENDING)
1448 pdq_process_unsolicited_events(pdq);
1449 if (data & PDQ_PSTS_CMD_RSP_PENDING)
1450 pdq_process_command_responses(pdq);
1451 if (data & PDQ_PSTS_TYPE_0_PENDING) {
1452 data = PDQ_CSR_READ(csrs, csr_host_int_type_0);
1453 if (data & PDQ_HOST_INT_STATE_CHANGE) {
1454 pdq_state_t state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(csrs, csr_port_status));
1455 printf(PDQ_OS_PREFIX "%s", PDQ_OS_PREFIX_ARGS, pdq_adapter_states[state]);
1456 if (state == PDQS_LINK_UNAVAILABLE) {
1299 pdq->pdq_flags &= ~PDQ_TXOK;
1457 pdq->pdq_flags &= ~(PDQ_TXOK|PDQ_IS_ONRING|PDQ_IS_FDX);
1300 } else if (state == PDQS_LINK_AVAILABLE) {
1458 } else if (state == PDQS_LINK_AVAILABLE) {
1301 pdq->pdq_flags |= PDQ_TXOK;
1459 if (pdq->pdq_flags & PDQ_WANT_FDX) {
1460 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_DEC_EXT_MIB_GET);
1461 pdq_queue_commands(pdq);
1462 }
1463 pdq->pdq_flags |= PDQ_TXOK|PDQ_IS_ONRING;
1302 pdq_os_restart_transmitter(pdq);
1303 } else if (state == PDQS_HALTED) {
1304 pdq_response_error_log_get_t log_entry;
1305 pdq_halt_code_t halt_code = PDQ_PSTS_HALT_ID(PDQ_CSR_READ(csrs, csr_port_status));
1306 printf(": halt code = %d (%s)\n",
1307 halt_code, pdq_halt_codes[halt_code]);
1308 if (halt_code == PDQH_DMA_ERROR && pdq->pdq_type == PDQ_DEFPA) {
1309 PDQ_PRINTF(("\tPFI status = 0x%x, Host 0 Fatal Interrupt = 0x%x\n",
1310 PDQ_CSR_READ(&pdq->pdq_pci_csrs, csr_pfi_status),
1311 data & PDQ_HOST_INT_FATAL_ERROR));
1312 }
1464 pdq_os_restart_transmitter(pdq);
1465 } else if (state == PDQS_HALTED) {
1466 pdq_response_error_log_get_t log_entry;
1467 pdq_halt_code_t halt_code = PDQ_PSTS_HALT_ID(PDQ_CSR_READ(csrs, csr_port_status));
1468 printf(": halt code = %d (%s)\n",
1469 halt_code, pdq_halt_codes[halt_code]);
1470 if (halt_code == PDQH_DMA_ERROR && pdq->pdq_type == PDQ_DEFPA) {
1471 PDQ_PRINTF(("\tPFI status = 0x%x, Host 0 Fatal Interrupt = 0x%x\n",
1472 PDQ_CSR_READ(&pdq->pdq_pci_csrs, csr_pfi_status),
1473 data & PDQ_HOST_INT_FATAL_ERROR));
1474 }
1313 pdq_read_error_log(pdq, &log_entry);
1475 PDQ_OS_MEMZERO(&log_entry, sizeof(log_entry));
1476 if (pdq_read_error_log(pdq, &log_entry)) {
1477 PDQ_PRINTF((" Error log Entry:\n"));
1478 PDQ_PRINTF((" CMD Status = %d (0x%x)\n",
1479 log_entry.error_log_get_status,
1480 log_entry.error_log_get_status));
1481 PDQ_PRINTF((" Event Status = %d (0x%x)\n",
1482 log_entry.error_log_get_event_status,
1483 log_entry.error_log_get_event_status));
1484 PDQ_PRINTF((" Caller Id = %d (0x%x)\n",
1485 log_entry.error_log_get_caller_id,
1486 log_entry.error_log_get_caller_id));
1487 PDQ_PRINTF((" Write Count = %d (0x%x)\n",
1488 log_entry.error_log_get_write_count,
1489 log_entry.error_log_get_write_count));
1490 PDQ_PRINTF((" FRU Implication Mask = %d (0x%x)\n",
1491 log_entry.error_log_get_fru_implication_mask,
1492 log_entry.error_log_get_fru_implication_mask));
1493 PDQ_PRINTF((" Test ID = %d (0x%x)\n",
1494 log_entry.error_log_get_test_id,
1495 log_entry.error_log_get_test_id));
1496 }
1314 pdq_stop(pdq);
1315 if (pdq->pdq_flags & PDQ_RUNNING)
1316 pdq_run(pdq);
1317 return 1;
1318 }
1319 printf("\n");
1320 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, PDQ_HOST_INT_STATE_CHANGE);
1321 }

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

1345 pdq_bus_memaddr_t csr_base,
1346 const char *name,
1347 int unit,
1348 void *ctx,
1349 pdq_type_t type)
1350{
1351 pdq_t *pdq;
1352 pdq_state_t state;
1497 pdq_stop(pdq);
1498 if (pdq->pdq_flags & PDQ_RUNNING)
1499 pdq_run(pdq);
1500 return 1;
1501 }
1502 printf("\n");
1503 PDQ_CSR_WRITE(csrs, csr_host_int_type_0, PDQ_HOST_INT_STATE_CHANGE);
1504 }

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

1528 pdq_bus_memaddr_t csr_base,
1529 const char *name,
1530 int unit,
1531 void *ctx,
1532 pdq_type_t type)
1533{
1534 pdq_t *pdq;
1535 pdq_state_t state;
1536 pdq_descriptor_block_t *dbp;
1537#if !defined(PDQ_BUS_DMA)
1353 const pdq_uint32_t contig_bytes = (sizeof(pdq_descriptor_block_t) * 2) - PDQ_OS_PAGESIZE;
1354 pdq_uint8_t *p;
1538 const pdq_uint32_t contig_bytes = (sizeof(pdq_descriptor_block_t) * 2) - PDQ_OS_PAGESIZE;
1539 pdq_uint8_t *p;
1540#endif
1355 int idx;
1356
1357 PDQ_ASSERT(sizeof(pdq_descriptor_block_t) == 8192);
1358 PDQ_ASSERT(sizeof(pdq_consumer_block_t) == 64);
1359 PDQ_ASSERT(sizeof(pdq_response_filter_get_t) == PDQ_SIZE_RESPONSE_FILTER_GET);
1360 PDQ_ASSERT(sizeof(pdq_cmd_addr_filter_set_t) == PDQ_SIZE_CMD_ADDR_FILTER_SET);
1361 PDQ_ASSERT(sizeof(pdq_response_addr_filter_get_t) == PDQ_SIZE_RESPONSE_ADDR_FILTER_GET);
1362 PDQ_ASSERT(sizeof(pdq_response_status_chars_get_t) == PDQ_SIZE_RESPONSE_STATUS_CHARS_GET);

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

1382 * to guarantee that we will a get 8KB block of memory aligned
1383 * on a 8KB boundary. This turns to require that we allocate
1384 * (N*2 - 1 page) pages of memory. On machine with less than
1385 * a 8KB page size, it mean we will allocate more memory than
1386 * we need. The extra will be used for the unsolicited event
1387 * buffers (though on machines with 8KB pages we will to allocate
1388 * them separately since there will be nothing left overs.)
1389 */
1541 int idx;
1542
1543 PDQ_ASSERT(sizeof(pdq_descriptor_block_t) == 8192);
1544 PDQ_ASSERT(sizeof(pdq_consumer_block_t) == 64);
1545 PDQ_ASSERT(sizeof(pdq_response_filter_get_t) == PDQ_SIZE_RESPONSE_FILTER_GET);
1546 PDQ_ASSERT(sizeof(pdq_cmd_addr_filter_set_t) == PDQ_SIZE_CMD_ADDR_FILTER_SET);
1547 PDQ_ASSERT(sizeof(pdq_response_addr_filter_get_t) == PDQ_SIZE_RESPONSE_ADDR_FILTER_GET);
1548 PDQ_ASSERT(sizeof(pdq_response_status_chars_get_t) == PDQ_SIZE_RESPONSE_STATUS_CHARS_GET);

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

1568 * to guarantee that we will a get 8KB block of memory aligned
1569 * on a 8KB boundary. This turns to require that we allocate
1570 * (N*2 - 1 page) pages of memory. On machine with less than
1571 * a 8KB page size, it mean we will allocate more memory than
1572 * we need. The extra will be used for the unsolicited event
1573 * buffers (though on machines with 8KB pages we will to allocate
1574 * them separately since there will be nothing left overs.)
1575 */
1576#if defined(PDQ_OS_MEMALLOC_CONTIG)
1390 p = (pdq_uint8_t *) PDQ_OS_MEMALLOC_CONTIG(contig_bytes);
1577 p = (pdq_uint8_t *) PDQ_OS_MEMALLOC_CONTIG(contig_bytes);
1578
1579if (p == NULL)
1580 printf("%s() - PDQ_OS_MEMALLOC_CONTIG() failed!\n", __FUNCTION__);
1581
1391 if (p != NULL) {
1582 if (p != NULL) {
1392 pdq_physaddr_t physaddr = PDQ_OS_VA_TO_PA(pdq, p);
1583 pdq_physaddr_t physaddr = PDQ_OS_VA_TO_BUSPA(pdq, p);
1393 /*
1394 * Assert that we really got contiguous memory. This isn't really
1395 * needed on systems that actually have physical contiguous allocation
1396 * routines, but on those systems that don't ...
1397 */
1398 for (idx = PDQ_OS_PAGESIZE; idx < 0x2000; idx += PDQ_OS_PAGESIZE) {
1584 /*
1585 * Assert that we really got contiguous memory. This isn't really
1586 * needed on systems that actually have physical contiguous allocation
1587 * routines, but on those systems that don't ...
1588 */
1589 for (idx = PDQ_OS_PAGESIZE; idx < 0x2000; idx += PDQ_OS_PAGESIZE) {
1399 if (PDQ_OS_VA_TO_PA(pdq, p + idx) - physaddr != idx)
1590 if (PDQ_OS_VA_TO_BUSPA(pdq, p + idx) - physaddr != idx)
1400 goto cleanup_and_return;
1401 }
1591 goto cleanup_and_return;
1592 }
1402 physaddr &= 0x1FFF;
1403 if (physaddr) {
1593 if (physaddr & 0x1FFF) {
1404 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) p;
1594 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) p;
1405 pdq->pdq_dbp = (pdq_descriptor_block_t *) &p[0x2000 - physaddr];
1595 pdq->pdq_unsolicited_info.ui_pa_bufstart = physaddr;
1596 pdq->pdq_dbp = (pdq_descriptor_block_t *) &p[0x2000 - (physaddr & 0x1FFF)];
1597 pdq->pdq_pa_descriptor_block = physaddr & ~0x1FFFUL;
1406 } else {
1407 pdq->pdq_dbp = (pdq_descriptor_block_t *) p;
1598 } else {
1599 pdq->pdq_dbp = (pdq_descriptor_block_t *) p;
1600 pdq->pdq_pa_descriptor_block = physaddr;
1408 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) &p[0x2000];
1601 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) &p[0x2000];
1602 pdq->pdq_unsolicited_info.ui_pa_bufstart = physaddr + 0x2000;
1409 }
1410 }
1603 }
1604 }
1605 pdq->pdq_cbp = (volatile pdq_consumer_block_t *) &pdq->pdq_dbp->pdqdb_consumer;
1606 pdq->pdq_pa_consumer_block = PDQ_DB_BUSPA(pdq, pdq->pdq_cbp);
1411 if (contig_bytes == sizeof(pdq_descriptor_block_t)) {
1412 pdq->pdq_unsolicited_info.ui_events =
1413 (pdq_unsolicited_event_t *) PDQ_OS_MEMALLOC(
1414 PDQ_NUM_UNSOLICITED_EVENTS * sizeof(pdq_unsolicited_event_t));
1415 }
1607 if (contig_bytes == sizeof(pdq_descriptor_block_t)) {
1608 pdq->pdq_unsolicited_info.ui_events =
1609 (pdq_unsolicited_event_t *) PDQ_OS_MEMALLOC(
1610 PDQ_NUM_UNSOLICITED_EVENTS * sizeof(pdq_unsolicited_event_t));
1611 }
1612#else
1613 if (pdq_os_memalloc_contig(pdq))
1614 goto cleanup_and_return;
1615#endif
1416
1417 /*
1418 * Make sure everything got allocated. If not, free what did
1419 * get allocated and return.
1420 */
1421 if (pdq->pdq_dbp == NULL || pdq->pdq_unsolicited_info.ui_events == NULL) {
1422 cleanup_and_return:
1616
1617 /*
1618 * Make sure everything got allocated. If not, free what did
1619 * get allocated and return.
1620 */
1621 if (pdq->pdq_dbp == NULL || pdq->pdq_unsolicited_info.ui_events == NULL) {
1622 cleanup_and_return:
1623#ifdef PDQ_OS_MEMFREE_CONTIG
1423 if (p /* pdq->pdq_dbp */ != NULL)
1424 PDQ_OS_MEMFREE_CONTIG(p /* pdq->pdq_dbp */, contig_bytes);
1425 if (contig_bytes == sizeof(pdq_descriptor_block_t) && pdq->pdq_unsolicited_info.ui_events != NULL)
1426 PDQ_OS_MEMFREE(pdq->pdq_unsolicited_info.ui_events,
1427 PDQ_NUM_UNSOLICITED_EVENTS * sizeof(pdq_unsolicited_event_t));
1624 if (p /* pdq->pdq_dbp */ != NULL)
1625 PDQ_OS_MEMFREE_CONTIG(p /* pdq->pdq_dbp */, contig_bytes);
1626 if (contig_bytes == sizeof(pdq_descriptor_block_t) && pdq->pdq_unsolicited_info.ui_events != NULL)
1627 PDQ_OS_MEMFREE(pdq->pdq_unsolicited_info.ui_events,
1628 PDQ_NUM_UNSOLICITED_EVENTS * sizeof(pdq_unsolicited_event_t));
1629#endif
1428 PDQ_OS_MEMFREE(pdq, sizeof(pdq_t));
1429 return NULL;
1430 }
1630 PDQ_OS_MEMFREE(pdq, sizeof(pdq_t));
1631 return NULL;
1632 }
1633 dbp = pdq->pdq_dbp;
1431
1634
1432 pdq->pdq_cbp = (volatile pdq_consumer_block_t *) &pdq->pdq_dbp->pdqdb_consumer;
1433 pdq->pdq_command_info.ci_bufstart = (pdq_uint8_t *) pdq->pdq_dbp->pdqdb_command_pool;
1434 pdq->pdq_rx_info.rx_buffers = (void *) pdq->pdq_dbp->pdqdb_receive_buffers;
1435
1436 pdq->pdq_host_smt_info.rx_buffers = (void *) pdq->pdq_dbp->pdqdb_host_smt_buffers;
1437
1438 PDQ_PRINTF(("\nPDQ Descriptor Block = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp));
1439 PDQ_PRINTF((" Recieve Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_receives));
1440 PDQ_PRINTF((" Transmit Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_transmits));
1441 PDQ_PRINTF((" Host SMT Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_host_smt));
1442 PDQ_PRINTF((" Command Response Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_command_responses));
1443 PDQ_PRINTF((" Command Request Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_command_requests));
1635 PDQ_PRINTF(("\nPDQ Descriptor Block = " PDQ_OS_PTR_FMT " (PA = 0x%x)\n", dbp, pdq->pdq_pa_descriptor_block));
1636 PDQ_PRINTF((" Receive Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_receives));
1637 PDQ_PRINTF((" Transmit Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_transmits));
1638 PDQ_PRINTF((" Host SMT Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_host_smt));
1639 PDQ_PRINTF((" Command Response Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_command_responses));
1640 PDQ_PRINTF((" Command Request Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_command_requests));
1444 PDQ_PRINTF(("PDQ Consumer Block = " PDQ_OS_PTR_FMT "\n", pdq->pdq_cbp));
1445
1446 /*
1447 * Zero out the descriptor block. Not really required but
1448 * it pays to be neat. This will also zero out the consumer
1449 * block, command pool, and buffer pointers for the receive
1450 * host_smt rings.
1451 */
1641 PDQ_PRINTF(("PDQ Consumer Block = " PDQ_OS_PTR_FMT "\n", pdq->pdq_cbp));
1642
1643 /*
1644 * Zero out the descriptor block. Not really required but
1645 * it pays to be neat. This will also zero out the consumer
1646 * block, command pool, and buffer pointers for the receive
1647 * host_smt rings.
1648 */
1452 PDQ_OS_MEMZERO(pdq->pdq_dbp, sizeof(*pdq->pdq_dbp));
1649 PDQ_OS_MEMZERO(dbp, sizeof(*dbp));
1453
1454 /*
1455 * Initialize the CSR references.
1456 * the DEFAA (FutureBus+) skips a longword between registers
1457 */
1458 pdq_init_csrs(&pdq->pdq_csrs, bus, csr_base, pdq->pdq_type == PDQ_DEFAA ? 2 : 1);
1459 if (pdq->pdq_type == PDQ_DEFPA)
1460 pdq_init_pci_csrs(&pdq->pdq_pci_csrs, bus, csr_base, 1);
1461
1650
1651 /*
1652 * Initialize the CSR references.
1653 * the DEFAA (FutureBus+) skips a longword between registers
1654 */
1655 pdq_init_csrs(&pdq->pdq_csrs, bus, csr_base, pdq->pdq_type == PDQ_DEFAA ? 2 : 1);
1656 if (pdq->pdq_type == PDQ_DEFPA)
1657 pdq_init_pci_csrs(&pdq->pdq_pci_csrs, bus, csr_base, 1);
1658
1462 PDQ_PRINTF(("PDQ CSRs: BASE = " PDQ_OS_PTR_FMT "\n", pdq->pdq_csrs.csr_base));
1463 PDQ_PRINTF((" Port Reset = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1659 PDQ_PRINTF(("PDQ CSRs: BASE = " PDQ_OS_CSR_FMT "\n", pdq->pdq_csrs.csr_base));
1660 PDQ_PRINTF((" Port Reset = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1464 pdq->pdq_csrs.csr_port_reset, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_reset)));
1661 pdq->pdq_csrs.csr_port_reset, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_reset)));
1465 PDQ_PRINTF((" Host Data = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1662 PDQ_PRINTF((" Host Data = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1466 pdq->pdq_csrs.csr_host_data, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_data)));
1663 pdq->pdq_csrs.csr_host_data, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_data)));
1467 PDQ_PRINTF((" Port Control = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1664 PDQ_PRINTF((" Port Control = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1468 pdq->pdq_csrs.csr_port_control, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_control)));
1665 pdq->pdq_csrs.csr_port_control, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_control)));
1469 PDQ_PRINTF((" Port Data A = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1666 PDQ_PRINTF((" Port Data A = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1470 pdq->pdq_csrs.csr_port_data_a, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_a)));
1667 pdq->pdq_csrs.csr_port_data_a, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_a)));
1471 PDQ_PRINTF((" Port Data B = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1668 PDQ_PRINTF((" Port Data B = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1472 pdq->pdq_csrs.csr_port_data_b, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_b)));
1669 pdq->pdq_csrs.csr_port_data_b, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_b)));
1473 PDQ_PRINTF((" Port Status = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1670 PDQ_PRINTF((" Port Status = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1474 pdq->pdq_csrs.csr_port_status, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status)));
1671 pdq->pdq_csrs.csr_port_status, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status)));
1475 PDQ_PRINTF((" Host Int Type 0 = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1672 PDQ_PRINTF((" Host Int Type 0 = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1476 pdq->pdq_csrs.csr_host_int_type_0, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_type_0)));
1673 pdq->pdq_csrs.csr_host_int_type_0, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_type_0)));
1477 PDQ_PRINTF((" Host Int Enable = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1674 PDQ_PRINTF((" Host Int Enable = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1478 pdq->pdq_csrs.csr_host_int_enable, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_enable)));
1675 pdq->pdq_csrs.csr_host_int_enable, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_enable)));
1479 PDQ_PRINTF((" Type 2 Producer = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1676 PDQ_PRINTF((" Type 2 Producer = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1480 pdq->pdq_csrs.csr_type_2_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_type_2_producer)));
1677 pdq->pdq_csrs.csr_type_2_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_type_2_producer)));
1481 PDQ_PRINTF((" Command Response Producer = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1678 PDQ_PRINTF((" Command Response Producer = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1482 pdq->pdq_csrs.csr_cmd_response_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_response_producer)));
1679 pdq->pdq_csrs.csr_cmd_response_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_response_producer)));
1483 PDQ_PRINTF((" Command Request Producer = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1680 PDQ_PRINTF((" Command Request Producer = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1484 pdq->pdq_csrs.csr_cmd_request_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_request_producer)));
1681 pdq->pdq_csrs.csr_cmd_request_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_request_producer)));
1485 PDQ_PRINTF((" Host SMT Producer = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1682 PDQ_PRINTF((" Host SMT Producer = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1486 pdq->pdq_csrs.csr_host_smt_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_smt_producer)));
1683 pdq->pdq_csrs.csr_host_smt_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_smt_producer)));
1487 PDQ_PRINTF((" Unsolicited Producer = " PDQ_OS_PTR_FMT " [0x%08x]\n",
1684 PDQ_PRINTF((" Unsolicited Producer = " PDQ_OS_CSR_FMT " [0x%08x]\n",
1488 pdq->pdq_csrs.csr_unsolicited_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_unsolicited_producer)));
1489
1490 /*
1491 * Initialize the command information block
1492 */
1685 pdq->pdq_csrs.csr_unsolicited_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_unsolicited_producer)));
1686
1687 /*
1688 * Initialize the command information block
1689 */
1493 pdq->pdq_command_info.ci_pa_bufstart = PDQ_OS_VA_TO_PA(pdq, pdq->pdq_command_info.ci_bufstart);
1494 for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_command_requests)/sizeof(pdq->pdq_dbp->pdqdb_command_requests[0]); idx++) {
1495 pdq_txdesc_t *txd = &pdq->pdq_dbp->pdqdb_command_requests[idx];
1690 pdq->pdq_command_info.ci_request_bufstart = dbp->pdqdb_cmd_request_buf;
1691 pdq->pdq_command_info.ci_pa_request_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_request_bufstart);
1692 pdq->pdq_command_info.ci_pa_request_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_requests);
1693 PDQ_PRINTF(("PDQ Command Request Buffer = " PDQ_OS_PTR_FMT " (PA=0x%x)\n",
1694 pdq->pdq_command_info.ci_request_bufstart,
1695 pdq->pdq_command_info.ci_pa_request_bufstart));
1696 for (idx = 0; idx < sizeof(dbp->pdqdb_command_requests)/sizeof(dbp->pdqdb_command_requests[0]); idx++) {
1697 pdq_txdesc_t *txd = &dbp->pdqdb_command_requests[idx];
1496
1698
1497 txd->txd_pa_lo = pdq->pdq_command_info.ci_pa_bufstart;
1699 txd->txd_pa_lo = pdq->pdq_command_info.ci_pa_request_bufstart;
1498 txd->txd_eop = txd->txd_sop = 1;
1499 txd->txd_pa_hi = 0;
1500 }
1700 txd->txd_eop = txd->txd_sop = 1;
1701 txd->txd_pa_hi = 0;
1702 }
1501 for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_command_responses)/sizeof(pdq->pdq_dbp->pdqdb_command_responses[0]); idx++) {
1502 pdq_rxdesc_t *rxd = &pdq->pdq_dbp->pdqdb_command_responses[idx];
1703 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_command_requests,
1704 sizeof(dbp->pdqdb_command_requests));
1503
1705
1504 rxd->rxd_pa_lo = pdq->pdq_command_info.ci_pa_bufstart;
1706 pdq->pdq_command_info.ci_response_bufstart = dbp->pdqdb_cmd_response_buf;
1707 pdq->pdq_command_info.ci_pa_response_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_response_bufstart);
1708 pdq->pdq_command_info.ci_pa_response_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_responses);
1709 PDQ_PRINTF(("PDQ Command Response Buffer = " PDQ_OS_PTR_FMT " (PA=0x%x)\n",
1710 pdq->pdq_command_info.ci_response_bufstart,
1711 pdq->pdq_command_info.ci_pa_response_bufstart));
1712 for (idx = 0; idx < sizeof(dbp->pdqdb_command_responses)/sizeof(dbp->pdqdb_command_responses[0]); idx++) {
1713 pdq_rxdesc_t *rxd = &dbp->pdqdb_command_responses[idx];
1714
1715 rxd->rxd_pa_lo = pdq->pdq_command_info.ci_pa_response_bufstart;
1505 rxd->rxd_sop = 1;
1506 rxd->rxd_seg_cnt = 0;
1507 rxd->rxd_seg_len_lo = 0;
1716 rxd->rxd_sop = 1;
1717 rxd->rxd_seg_cnt = 0;
1718 rxd->rxd_seg_len_lo = 0;
1719 rxd->rxd_seg_len_hi = PDQ_SIZE_COMMAND_RESPONSE / 16;
1508 }
1720 }
1721 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_command_responses,
1722 sizeof(dbp->pdqdb_command_responses));
1509
1510 /*
1511 * Initialize the unsolicited event information block
1512 */
1513 pdq->pdq_unsolicited_info.ui_free = PDQ_NUM_UNSOLICITED_EVENTS;
1723
1724 /*
1725 * Initialize the unsolicited event information block
1726 */
1727 pdq->pdq_unsolicited_info.ui_free = PDQ_NUM_UNSOLICITED_EVENTS;
1514 pdq->pdq_unsolicited_info.ui_pa_bufstart = PDQ_OS_VA_TO_PA(pdq, pdq->pdq_unsolicited_info.ui_events);
1515 for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_unsolicited_events)/sizeof(pdq->pdq_dbp->pdqdb_unsolicited_events[0]); idx++) {
1516 pdq_rxdesc_t *rxd = &pdq->pdq_dbp->pdqdb_unsolicited_events[idx];
1728 pdq->pdq_unsolicited_info.ui_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_unsolicited_events);
1729 PDQ_PRINTF(("PDQ Unsolicit Event Buffer = " PDQ_OS_PTR_FMT " (PA=0x%x)\n",
1730 pdq->pdq_unsolicited_info.ui_events,
1731 pdq->pdq_unsolicited_info.ui_pa_bufstart));
1732 for (idx = 0; idx < sizeof(dbp->pdqdb_unsolicited_events)/sizeof(dbp->pdqdb_unsolicited_events[0]); idx++) {
1733 pdq_rxdesc_t *rxd = &dbp->pdqdb_unsolicited_events[idx];
1517 pdq_unsolicited_event_t *event = &pdq->pdq_unsolicited_info.ui_events[idx & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
1518
1519 rxd->rxd_sop = 1;
1520 rxd->rxd_seg_cnt = 0;
1521 rxd->rxd_seg_len_hi = sizeof(pdq_unsolicited_event_t) / 16;
1522 rxd->rxd_pa_lo = pdq->pdq_unsolicited_info.ui_pa_bufstart + (const pdq_uint8_t *) event
1523 - (const pdq_uint8_t *) pdq->pdq_unsolicited_info.ui_events;
1524 rxd->rxd_pa_hi = 0;
1734 pdq_unsolicited_event_t *event = &pdq->pdq_unsolicited_info.ui_events[idx & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
1735
1736 rxd->rxd_sop = 1;
1737 rxd->rxd_seg_cnt = 0;
1738 rxd->rxd_seg_len_hi = sizeof(pdq_unsolicited_event_t) / 16;
1739 rxd->rxd_pa_lo = pdq->pdq_unsolicited_info.ui_pa_bufstart + (const pdq_uint8_t *) event
1740 - (const pdq_uint8_t *) pdq->pdq_unsolicited_info.ui_events;
1741 rxd->rxd_pa_hi = 0;
1742 PDQ_OS_UNSOL_EVENT_PRESYNC(pdq, event);
1525 }
1743 }
1744 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_unsolicited_events,
1745 sizeof(dbp->pdqdb_unsolicited_events));
1746
1526 /*
1527 * Initialize the receive information blocks (normal and SMT).
1528 */
1747 /*
1748 * Initialize the receive information blocks (normal and SMT).
1749 */
1529 pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives);
1750 pdq->pdq_rx_info.rx_buffers = pdq->pdq_receive_buffers;
1751 pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_receives);
1530 pdq->pdq_rx_info.rx_target = pdq->pdq_rx_info.rx_free - PDQ_RX_SEGCNT * 8;
1752 pdq->pdq_rx_info.rx_target = pdq->pdq_rx_info.rx_free - PDQ_RX_SEGCNT * 8;
1753 pdq->pdq_rx_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_receives);
1531
1754
1532 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt);
1755 pdq->pdq_host_smt_info.rx_buffers = pdq->pdq_host_smt_buffers;
1756 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_host_smt);
1533 pdq->pdq_host_smt_info.rx_target = pdq->pdq_host_smt_info.rx_free - PDQ_RX_SEGCNT * 3;
1757 pdq->pdq_host_smt_info.rx_target = pdq->pdq_host_smt_info.rx_free - PDQ_RX_SEGCNT * 3;
1758 pdq->pdq_host_smt_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_host_smt);
1534
1535 /*
1536 * Initialize the transmit information block.
1537 */
1759
1760 /*
1761 * Initialize the transmit information block.
1762 */
1538 pdq->pdq_tx_hdr[0] = PDQ_FDDI_PH0;
1539 pdq->pdq_tx_hdr[1] = PDQ_FDDI_PH1;
1540 pdq->pdq_tx_hdr[2] = PDQ_FDDI_PH2;
1541 pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
1542 pdq->pdq_tx_info.tx_hdrdesc.txd_seg_len = sizeof(pdq->pdq_tx_hdr);
1763 dbp->pdqdb_tx_hdr[0] = PDQ_FDDI_PH0;
1764 dbp->pdqdb_tx_hdr[1] = PDQ_FDDI_PH1;
1765 dbp->pdqdb_tx_hdr[2] = PDQ_FDDI_PH2;
1766 pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(dbp->pdqdb_transmits);
1767 pdq->pdq_tx_info.tx_hdrdesc.txd_seg_len = 3;
1543 pdq->pdq_tx_info.tx_hdrdesc.txd_sop = 1;
1768 pdq->pdq_tx_info.tx_hdrdesc.txd_sop = 1;
1544 pdq->pdq_tx_info.tx_hdrdesc.txd_pa_lo = PDQ_OS_VA_TO_PA(pdq, pdq->pdq_tx_hdr);
1769 pdq->pdq_tx_info.tx_hdrdesc.txd_pa_lo = PDQ_DB_BUSPA(pdq, dbp->pdqdb_tx_hdr);
1770 pdq->pdq_tx_info.tx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_transmits);
1545
1546 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status));
1547 PDQ_PRINTF(("PDQ Adapter State = %s\n", pdq_adapter_states[state]));
1548
1549 /*
1550 * Stop the PDQ if it is running and put it into a known state.
1551 */
1552 state = pdq_stop(pdq);

--- 38 unchanged lines hidden ---
1771
1772 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status));
1773 PDQ_PRINTF(("PDQ Adapter State = %s\n", pdq_adapter_states[state]));
1774
1775 /*
1776 * Stop the PDQ if it is running and put it into a known state.
1777 */
1778 state = pdq_stop(pdq);

--- 38 unchanged lines hidden ---