Lines Matching defs:pdq

1 /*	$NetBSD: pdq.c,v 1.33 2001/11/13 13:14:43 lukem Exp $	*/
26 * Id: pdq.c,v 1.32 1997/06/05 01:56:35 thomas Exp
46 #define PDQ_HWSUPPORT /* for pdq.h */
51 #include <dev/pdq/pdq_freebsd.h>
52 #include <dev/pdq/pdqreg.h>
175 pdq_t *pdq,
184 pdq_descriptions[pdq->pdq_type],
189 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[0] >> 4],
190 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[0] & 0x0F],
191 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[1] >> 4],
192 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[1] & 0x0F],
193 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[2] >> 4],
194 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[2] & 0x0F],
195 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[3] >> 4],
196 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[3] & 0x0F],
197 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[4] >> 4],
198 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[4] & 0x0F],
199 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[5] >> 4],
200 hexchars[pdq->pdq_hwaddr.lanaddr_bytes[5] & 0x0F],
201 pdq->pdq_fwrev.fwrev_bytes[0], pdq->pdq_fwrev.fwrev_bytes[1],
202 pdq->pdq_fwrev.fwrev_bytes[2], pdq->pdq_fwrev.fwrev_bytes[3],
222 pdq_os_update_status(pdq, rsp);
268 pdq_t *pdq,
276 PDQ_OS_DATABUF_FREE(pdq, pdu);
343 pdq_t *pdq,
346 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
457 pdq_t *pdq)
459 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
460 pdq_command_info_t * const ci = &pdq->pdq_command_info;
461 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
520 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PROMISC ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
523 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_ALLMULTI ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
526 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);
529 filter_set->filter_set_items[idx].filter_state = (pdq->pdq_flags & PDQ_PASS_SMT ? PDQ_FILTER_PASS : PDQ_FILTER_BLOCK);
544 pdq_os_addr_fill(pdq, addr, 61);
551 snmp_set->snmp_set_items[idx].item_value = (pdq->pdq_flags & PDQ_WANT_FDX ? 1 : 2);
567 PDQ_OS_CMDRQST_PRESYNC(pdq, txd->txd_seg_len);
568 PDQ_OS_DESC_PRESYNC(pdq, txd, sizeof(pdq_txdesc_t));
575 PDQ_OS_CMDRSP_PRESYNC(pdq, PDQ_SIZE_COMMAND_RESPONSE);
592 pdq_t * const pdq)
594 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
595 pdq_command_info_t * const ci = &pdq->pdq_command_info;
596 volatile const pdq_consumer_block_t * const cbp = pdq->pdq_cbp;
597 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
611 PDQ_OS_CMDRSP_POSTSYNC(pdq, PDQ_SIZE_COMMAND_RESPONSE);
619 if (rspgen->generic_op == PDQC_STATUS_CHARS_GET && (pdq->pdq_flags & PDQ_PRINTCHARS)) {
620 pdq->pdq_flags &= ~PDQ_PRINTCHARS;
621 pdq_print_fddi_chars(pdq, (const pdq_response_status_chars_get_t *) rspgen);
623 pdq->pdq_flags &= ~PDQ_IS_FDX;
625 pdq->pdq_flags |= PDQ_IS_FDX;
633 pdq_queue_commands(pdq);
651 pdq_t *pdq)
653 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
654 pdq_unsolicited_info_t *ui = &pdq->pdq_unsolicited_info;
655 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
656 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
665 PDQ_OS_UNSOL_EVENT_POSTSYNC(pdq, event);
704 PDQ_OS_UNSOL_EVENT_PRESYNC(pdq, event);
722 pdq_t *pdq,
742 PDQ_OS_RXPDU_POSTSYNC(pdq, fpdu, 0, sizeof(u_int32_t));
747 PDQ_OS_RXPDU_POSTSYNC(pdq, fpdu, sizeof(u_int32_t),
777 PDQ_OS_DATABUF_ALLOC(pdq, npdu);
784 PDQ_OS_DATABUF_ALLOC(pdq, npdu);
787 PDQ_OS_DATABUF_FREE(pdq, fpdu);
809 pdq_os_receive_pdu(pdq, fpdu, pdulen,
856 rxd->rxd_pa_lo = PDQ_OS_DATABUF_BUSPA(pdq, buffers[rx->rx_producer]);
857 PDQ_OS_RXPDU_PRESYNC(pdq, buffers[rx->rx_producer], 0, PDQ_OS_DATABUF_SIZE);
858 PDQ_OS_DESC_PRESYNC(pdq, rxd, sizeof(*rxd));
875 PDQ_OS_DATABUF_ALLOC(pdq, pdu);
888 rxd->rxd_pa_lo = PDQ_OS_DATABUF_BUSPA(pdq, pdu);
889 PDQ_OS_RXPDU_PRESYNC(pdq, pdu, 0, PDQ_OS_DATABUF_SIZE);
890 PDQ_OS_DESC_PRESYNC(pdq, rxd, sizeof(*rxd));
906 static void pdq_process_transmitted_data(pdq_t *pdq);
910 pdq_t *pdq,
913 pdq_tx_info_t * const tx = &pdq->pdq_tx_info;
914 pdq_descriptor_block_t * const dbp = pdq->pdq_dbp;
933 pdq->pdq_intrmask |= PDQ_HOST_INT_TX_ENABLE;
934 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
940 PDQ_OS_DESC_PRESYNC(pdq, &dbp->pdqdb_transmits[producer], sizeof(pdq_txdesc_t));
956 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
983 eop->txd_pa_lo = PDQ_OS_VA_TO_BUSPA(pdq, dataptr);
985 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
998 PDQ_OS_CONSUMER_POSTSYNC(pdq);
999 pdq_process_transmitted_data(pdq);
1010 pdq->pdq_intrmask |= PDQ_HOST_INT_TX_ENABLE;
1011 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
1020 PDQ_OS_DESC_PRESYNC(pdq, &dbp->pdqdb_transmits[tx->tx_producer],
1024 PDQ_OS_DESC_PRESYNC(pdq, eop, sizeof(pdq_txdesc_t));
1028 PDQ_DO_TYPE2_PRODUCER(pdq);
1035 pdq_t *pdq)
1037 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
1038 volatile const pdq_consumer_block_t *cbp = pdq->pdq_cbp;
1039 pdq_descriptor_block_t *dbp = pdq->pdq_dbp;
1049 pdq_os_transmit_done(pdq, pdu);
1056 pdq->pdq_intrmask &= ~PDQ_HOST_INT_TX_ENABLE;
1057 PDQ_CSR_WRITE(&pdq->pdq_csrs, csr_host_int_enable, pdq->pdq_intrmask);
1058 pdq_os_restart_transmitter(pdq);
1061 PDQ_DO_TYPE2_PRODUCER(pdq);
1067 pdq_t *pdq)
1069 volatile pdq_consumer_block_t *cbp = pdq->pdq_cbp;
1070 pdq_tx_info_t *tx = &pdq->pdq_tx_info;
1081 PDQ_OS_DATABUF_FREE(pdq, pdu);
1084 tx->tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
1086 PDQ_OS_CONSUMER_PRESYNC(pdq);
1088 PDQ_DO_TYPE2_PRODUCER(pdq);
1094 pdq_t *pdq)
1096 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
1104 (state == PDQS_HALTED && pdq->pdq_type != PDQ_DEFTA) ? 0 : PDQ_PRESET_SKIP_SELFTEST);
1128 pdq_t *pdq)
1131 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
1138 pdq_hwreset(pdq);
1176 pdq_read_mla(&pdq->pdq_csrs, &pdq->pdq_hwaddr);
1177 pdq_read_fwrev(&pdq->pdq_csrs, &pdq->pdq_fwrev);
1178 pdq->pdq_chip_rev = pdq_read_chiprev(&pdq->pdq_csrs);
1180 if (pdq->pdq_type == PDQ_DEFPA) {
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);
1191 pdq_flush_databuf_queue(pdq, &pdq->pdq_tx_info.tx_txq);
1192 pdq->pdq_flags &= ~(PDQ_TXOK|PDQ_IS_ONRING|PDQ_IS_FDX);
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++) {
1196 PDQ_OS_DATABUF_FREE(pdq, buffers[idx]);
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++) {
1204 PDQ_OS_DATABUF_FREE(pdq, buffers[idx]);
1208 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt);
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);
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;
1228 pdq->pdq_unsolicited_info.ui_producer = 0;
1229 pdq->pdq_unsolicited_info.ui_completion = 0;
1230 pdq->pdq_rx_info.rx_producer = 0;
1231 pdq->pdq_rx_info.rx_completion = 0;
1232 pdq->pdq_tx_info.tx_producer = 0;
1233 pdq->pdq_tx_info.tx_completion = 0;
1234 pdq->pdq_host_smt_info.rx_producer = 0;
1235 pdq->pdq_host_smt_info.rx_completion = 0;
1237 pdq->pdq_command_info.ci_command_active = 0;
1238 pdq->pdq_unsolicited_info.ui_free = PDQ_NUM_UNSOLICITED_EVENTS;
1239 pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
1245 if (pdq->pdq_type == PDQ_DEFPA) {
1247 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_mode_control,
1250 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_mode_control,
1259 pdq_process_unsolicited_events(pdq);
1261 if ((pdq->pdq_type == PDQ_DEFEA && pdq->pdq_chip_rev == PDQ_CHIP_REV_E)
1262 || pdq->pdq_type == PDQ_DEFTA)
1273 PDQ_OS_CONSUMER_PRESYNC(pdq);
1276 PDQ_CSR_WRITE(csrs, csr_port_data_a, pdq->pdq_pa_consumer_block);
1281 PDQ_CSR_WRITE(csrs, csr_port_data_a, pdq->pdq_pa_descriptor_block | PDQ_DMA_INIT_LW_BSWAP_DATA);
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);
1304 pdq->pdq_intrmask = 0;
1308 PDQ_CSR_WRITE(csrs, csr_host_int_enable, pdq->pdq_intrmask);
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);
1318 if (pdq->pdq_flags & PDQ_PRINTCHARS) {
1323 PDQ_OS_CONSUMER_POSTSYNC(pdq);
1324 pdq_process_command_responses(pdq);
1325 if (pdq->pdq_command_info.ci_response_producer == pdq->pdq_command_info.ci_response_completion)
1338 pdq_t *pdq)
1340 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
1357 pdq->pdq_intrmask = PDQ_HOST_INT_STATE_CHANGE
1361 PDQ_CSR_WRITE(csrs, csr_host_int_enable, pdq->pdq_intrmask);
1365 pdq_process_unsolicited_events(pdq);
1366 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1367 pdq->pdq_dbp->pdqdb_receives,
1368 pdq->pdq_cbp->pdqcb_receives,
1369 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1370 PDQ_DO_TYPE2_PRODUCER(pdq);
1371 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1372 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1373 pdq->pdq_dbp->pdqdb_host_smt,
1374 pdq->pdq_cbp->pdqcb_host_smt,
1375 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1377 pdq->pdq_host_smt_info.rx_producer
1378 | (pdq->pdq_host_smt_info.rx_completion << 8));
1380 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1384 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1385 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1386 pdq_queue_commands(pdq);
1391 pdq->pdq_command_info.ci_pending_commands = PDQ_BITMASK(PDQC_FILTER_SET)
1394 if (pdq->pdq_flags & PDQ_PRINTCHARS)
1395 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_STATUS_CHARS_GET);
1396 if (pdq->pdq_flags & PDQ_PASS_SMT) {
1397 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1398 pdq->pdq_dbp->pdqdb_host_smt,
1399 pdq->pdq_cbp->pdqcb_host_smt,
1400 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1402 pdq->pdq_host_smt_info.rx_producer
1403 | (pdq->pdq_host_smt_info.rx_completion << 8));
1405 pdq_process_unsolicited_events(pdq);
1406 pdq_queue_commands(pdq);
1420 pdq_t *pdq)
1422 const pdq_csrs_t * const csrs = &pdq->pdq_csrs;
1426 if (pdq->pdq_type == PDQ_DEFPA)
1427 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x18);
1432 PDQ_OS_CONSUMER_POSTSYNC(pdq);
1434 pdq_process_received_data(pdq, &pdq->pdq_rx_info,
1435 pdq->pdq_dbp->pdqdb_receives,
1436 pdq->pdq_cbp->pdqcb_receives,
1437 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives));
1438 PDQ_DO_TYPE2_PRODUCER(pdq);
1441 pdq_process_received_data(pdq, &pdq->pdq_host_smt_info,
1442 pdq->pdq_dbp->pdqdb_host_smt,
1443 pdq->pdq_cbp->pdqcb_host_smt,
1444 PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt));
1445 PDQ_DO_HOST_SMT_PRODUCER(pdq);
1448 pdq_process_transmitted_data(pdq);
1450 pdq_process_unsolicited_events(pdq);
1452 pdq_process_command_responses(pdq);
1459 pdq->pdq_flags &= ~(PDQ_TXOK|PDQ_IS_ONRING|PDQ_IS_FDX);
1461 if (pdq->pdq_flags & PDQ_WANT_FDX) {
1462 pdq->pdq_command_info.ci_pending_commands |= PDQ_BITMASK(PDQC_DEC_EXT_MIB_GET);
1463 pdq_queue_commands(pdq);
1465 pdq->pdq_flags |= PDQ_TXOK|PDQ_IS_ONRING;
1466 pdq_os_restart_transmitter(pdq);
1472 if (halt_code == PDQH_DMA_ERROR && pdq->pdq_type == PDQ_DEFPA) {
1474 PDQ_CSR_READ(&pdq->pdq_pci_csrs, csr_pfi_status),
1478 if (pdq_read_error_log(pdq, &log_entry)) {
1499 pdq_stop(pdq);
1500 if (pdq->pdq_flags & PDQ_RUNNING)
1501 pdq_run(pdq);
1508 pdq_stop(pdq);
1509 if (pdq->pdq_flags & PDQ_RUNNING)
1510 pdq_run(pdq);
1515 pdq->pdq_flags &= ~PDQ_TXOK;
1516 pdq_flush_transmitter(pdq);
1521 if (pdq->pdq_type == PDQ_DEFPA)
1522 PDQ_CSR_WRITE(&pdq->pdq_pci_csrs, csr_pfi_status, 0x18);
1537 pdq_t *pdq;
1556 pdq = (pdq_t *) PDQ_OS_MEMALLOC(sizeof(pdq_t));
1557 if (pdq == NULL) {
1558 PDQ_PRINTF(("malloc(%d) failed\n", sizeof(*pdq)));
1561 PDQ_OS_MEMZERO(pdq, sizeof(pdq_t));
1562 pdq->pdq_type = type;
1563 pdq->pdq_unit = unit;
1564 pdq->pdq_os_ctx = (void *) ctx;
1565 pdq->pdq_os_name = name;
1566 pdq->pdq_flags = PDQ_PRINTCHARS;
1586 pdq_physaddr_t physaddr = PDQ_OS_VA_TO_BUSPA(pdq, p);
1593 if (PDQ_OS_VA_TO_BUSPA(pdq, p + idx) - physaddr != idx)
1597 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) p;
1598 pdq->pdq_unsolicited_info.ui_pa_bufstart = physaddr;
1599 pdq->pdq_dbp = (pdq_descriptor_block_t *) &p[0x2000 - (physaddr & 0x1FFF)];
1600 pdq->pdq_pa_descriptor_block = physaddr & ~0x1FFFUL;
1602 pdq->pdq_dbp = (pdq_descriptor_block_t *) p;
1603 pdq->pdq_pa_descriptor_block = physaddr;
1604 pdq->pdq_unsolicited_info.ui_events = (pdq_unsolicited_event_t *) &p[0x2000];
1605 pdq->pdq_unsolicited_info.ui_pa_bufstart = physaddr + 0x2000;
1608 pdq->pdq_cbp = (volatile pdq_consumer_block_t *) &pdq->pdq_dbp->pdqdb_consumer;
1609 pdq->pdq_pa_consumer_block = PDQ_DB_BUSPA(pdq, pdq->pdq_cbp);
1611 pdq->pdq_unsolicited_info.ui_events =
1616 if (pdq_os_memalloc_contig(pdq))
1624 if (pdq->pdq_dbp == NULL || pdq->pdq_unsolicited_info.ui_events == NULL) {
1627 if (p /* pdq->pdq_dbp */ != NULL)
1628 PDQ_OS_MEMFREE_CONTIG(p /* pdq->pdq_dbp */, contig_bytes);
1629 if (contig_bytes == sizeof(pdq_descriptor_block_t) && pdq->pdq_unsolicited_info.ui_events != NULL)
1630 PDQ_OS_MEMFREE(pdq->pdq_unsolicited_info.ui_events,
1633 PDQ_OS_MEMFREE(pdq, sizeof(pdq_t));
1636 dbp = pdq->pdq_dbp;
1638 PDQ_PRINTF(("\nPDQ Descriptor Block = " PDQ_OS_PTR_FMT " (PA = 0x%x)\n", dbp, pdq->pdq_pa_descriptor_block));
1644 PDQ_PRINTF(("PDQ Consumer Block = " PDQ_OS_PTR_FMT "\n", pdq->pdq_cbp));
1658 pdq_init_csrs(&pdq->pdq_csrs, bus, csr_base, pdq->pdq_type == PDQ_DEFAA ? 2 : 1);
1659 if (pdq->pdq_type == PDQ_DEFPA)
1660 pdq_init_pci_csrs(&pdq->pdq_pci_csrs, bus, csr_base, 1);
1662 PDQ_PRINTF(("PDQ CSRs: BASE = " PDQ_OS_CSR_FMT "\n", pdq->pdq_csrs.csr_base));
1664 pdq->pdq_csrs.csr_port_reset, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_reset)));
1666 pdq->pdq_csrs.csr_host_data, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_data)));
1668 pdq->pdq_csrs.csr_port_control, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_control)));
1670 pdq->pdq_csrs.csr_port_data_a, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_a)));
1672 pdq->pdq_csrs.csr_port_data_b, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_data_b)));
1674 pdq->pdq_csrs.csr_port_status, PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status)));
1676 pdq->pdq_csrs.csr_host_int_type_0, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_type_0)));
1678 pdq->pdq_csrs.csr_host_int_enable, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_enable)));
1680 pdq->pdq_csrs.csr_type_2_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_type_2_producer)));
1682 pdq->pdq_csrs.csr_cmd_response_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_response_producer)));
1684 pdq->pdq_csrs.csr_cmd_request_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_cmd_request_producer)));
1686 pdq->pdq_csrs.csr_host_smt_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_smt_producer)));
1688 pdq->pdq_csrs.csr_unsolicited_producer, PDQ_CSR_READ(&pdq->pdq_csrs, csr_unsolicited_producer)));
1693 pdq->pdq_command_info.ci_request_bufstart = dbp->pdqdb_cmd_request_buf;
1694 pdq->pdq_command_info.ci_pa_request_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_request_bufstart);
1695 pdq->pdq_command_info.ci_pa_request_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_requests);
1697 pdq->pdq_command_info.ci_request_bufstart,
1698 pdq->pdq_command_info.ci_pa_request_bufstart));
1702 txd->txd_pa_lo = pdq->pdq_command_info.ci_pa_request_bufstart;
1706 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_command_requests,
1709 pdq->pdq_command_info.ci_response_bufstart = dbp->pdqdb_cmd_response_buf;
1710 pdq->pdq_command_info.ci_pa_response_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_response_bufstart);
1711 pdq->pdq_command_info.ci_pa_response_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_responses);
1713 pdq->pdq_command_info.ci_response_bufstart,
1714 pdq->pdq_command_info.ci_pa_response_bufstart));
1718 rxd->rxd_pa_lo = pdq->pdq_command_info.ci_pa_response_bufstart;
1724 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_command_responses,
1730 pdq->pdq_unsolicited_info.ui_free = PDQ_NUM_UNSOLICITED_EVENTS;
1731 pdq->pdq_unsolicited_info.ui_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_unsolicited_events);
1733 pdq->pdq_unsolicited_info.ui_events,
1734 pdq->pdq_unsolicited_info.ui_pa_bufstart));
1737 pdq_unsolicited_event_t *event = &pdq->pdq_unsolicited_info.ui_events[idx & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
1742 rxd->rxd_pa_lo = pdq->pdq_unsolicited_info.ui_pa_bufstart + (const pdq_uint8_t *) event
1743 - (const pdq_uint8_t *) pdq->pdq_unsolicited_info.ui_events;
1745 PDQ_OS_UNSOL_EVENT_PRESYNC(pdq, event);
1747 PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_unsolicited_events,
1753 pdq->pdq_rx_info.rx_buffers = pdq->pdq_receive_buffers;
1754 pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_receives);
1755 pdq->pdq_rx_info.rx_target = pdq->pdq_rx_info.rx_free - PDQ_RX_SEGCNT * 8;
1756 pdq->pdq_rx_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_receives);
1758 pdq->pdq_host_smt_info.rx_buffers = pdq->pdq_host_smt_buffers;
1759 pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_host_smt);
1760 pdq->pdq_host_smt_info.rx_target = pdq->pdq_host_smt_info.rx_free - PDQ_RX_SEGCNT * 3;
1761 pdq->pdq_host_smt_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_host_smt);
1769 pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(dbp->pdqdb_transmits);
1770 pdq->pdq_tx_info.tx_hdrdesc.txd_seg_len = 3;
1771 pdq->pdq_tx_info.tx_hdrdesc.txd_sop = 1;
1772 pdq->pdq_tx_info.tx_hdrdesc.txd_pa_lo = PDQ_DB_BUSPA(pdq, dbp->pdqdb_tx_hdr);
1773 pdq->pdq_tx_info.tx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_transmits);
1775 state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status));
1781 state = pdq_stop(pdq);
1791 pdq_halt_code_t halt_code = PDQ_PSTS_HALT_ID(PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status));
1793 if (halt_code == PDQH_DMA_ERROR && pdq->pdq_type == PDQ_DEFPA)
1795 PDQ_CSR_READ(&pdq->pdq_pci_csrs, csr_pfi_status),
1796 PDQ_CSR_READ(&pdq->pdq_csrs, csr_host_int_type_0) & PDQ_HOST_INT_FATAL_ERROR));
1803 pdq->pdq_hwaddr.lanaddr_bytes[0], pdq->pdq_hwaddr.lanaddr_bytes[1],
1804 pdq->pdq_hwaddr.lanaddr_bytes[2], pdq->pdq_hwaddr.lanaddr_bytes[3],
1805 pdq->pdq_hwaddr.lanaddr_bytes[4], pdq->pdq_hwaddr.lanaddr_bytes[5]));
1807 pdq->pdq_fwrev.fwrev_bytes[0], pdq->pdq_fwrev.fwrev_bytes[1],
1808 pdq->pdq_fwrev.fwrev_bytes[2], pdq->pdq_fwrev.fwrev_bytes[3]));
1810 switch (pdq->pdq_chip_rev) {
1814 default: PDQ_PRINTF(("Unknown Rev %d", (int) pdq->pdq_chip_rev));
1818 return pdq;