Fix dmamap leakages. fix transmit bug. fix receive bugs. fix mips
coherency problems.
This commit is contained in:
parent
1ce82f8f84
commit
144c41e986
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pdq.c,v 1.13 1998/05/21 20:44:02 matt Exp $ */
|
||||
/* $NetBSD: pdq.c,v 1.14 1998/05/24 21:40:06 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1995,1996 Matt Thomas <matt@3am-software.com>
|
||||
|
@ -607,6 +607,7 @@ pdq_process_command_responses(
|
|||
|
||||
PDQ_ASSERT(cbp->pdqcb_command_request != ci->ci_request_completion);
|
||||
|
||||
PDQ_OS_CMDRSP_POSTSYNC(pdq, PDQ_SIZE_COMMAND_RESPONSE);
|
||||
rspgen = (const pdq_response_generic_t *) ci->ci_response_bufstart;
|
||||
PDQ_ASSERT(rspgen->generic_status == PDQR_SUCCESS);
|
||||
PDQ_PRINTF(("PDQ Process Command Response: %s completed (status=%d)\n",
|
||||
|
@ -903,7 +904,7 @@ pdq_queue_transmit_data(
|
|||
|
||||
#if defined(PDQ_BUS_DMA)
|
||||
map = M_GETCTX(pdu, bus_dmamap_t);
|
||||
if ((freecnt = tx->tx_free - 1) > map->dm_nsegs) {
|
||||
if ((freecnt = tx->tx_free - 1) >= map->dm_nsegs) {
|
||||
int idx;
|
||||
for (idx = 0; idx < map->dm_nsegs; idx++) {
|
||||
/*
|
||||
|
@ -1021,6 +1022,7 @@ pdq_flush_transmitter(
|
|||
|
||||
tx->tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
|
||||
cbp->pdqcb_transmits = tx->tx_completion = tx->tx_producer;
|
||||
PDQ_OS_CONSUMER_PRESYNC(pdq);
|
||||
|
||||
PDQ_DO_TYPE2_PRODUCER(pdq);
|
||||
}
|
||||
|
@ -1151,6 +1153,7 @@ pdq_stop(
|
|||
pdq->pdq_cbp->pdqcb_unsolicited_event = 0;
|
||||
pdq->pdq_cbp->pdqcb_command_response = 0;
|
||||
pdq->pdq_cbp->pdqcb_command_request = 0;
|
||||
PDQ_OS_CONSUMER_PRESYNC(pdq);
|
||||
|
||||
/*
|
||||
* Reset the producer and completion indexes to 0.
|
||||
|
@ -1248,6 +1251,7 @@ pdq_stop(
|
|||
* Now wait (up to 100ms) for the command(s) to finish.
|
||||
*/
|
||||
for (cnt = 0; cnt < 1000; cnt++) {
|
||||
PDQ_OS_CONSUMER_POSTSYNC(pdq);
|
||||
pdq_process_command_responses(pdq);
|
||||
if (pdq->pdq_command_info.ci_response_producer == pdq->pdq_command_info.ci_response_completion)
|
||||
break;
|
||||
|
@ -1458,6 +1462,7 @@ pdq_initialize(
|
|||
{
|
||||
pdq_t *pdq;
|
||||
pdq_state_t state;
|
||||
pdq_descriptor_block_t *dbp;
|
||||
#if !defined(PDQ_BUS_DMA)
|
||||
const pdq_uint32_t contig_bytes = (sizeof(pdq_descriptor_block_t) * 2) - PDQ_OS_PAGESIZE;
|
||||
pdq_uint8_t *p;
|
||||
|
@ -1548,21 +1553,22 @@ pdq_initialize(
|
|||
PDQ_OS_MEMFREE(pdq, sizeof(pdq_t));
|
||||
return NULL;
|
||||
}
|
||||
dbp = pdq->pdq_dbp;
|
||||
|
||||
pdq->pdq_cbp = (volatile pdq_consumer_block_t *) &pdq->pdq_dbp->pdqdb_consumer;
|
||||
pdq->pdq_cbp = (volatile pdq_consumer_block_t *) &dbp->pdqdb_consumer;
|
||||
pdq->pdq_pa_consumer_block = PDQ_DB_BUSPA(pdq, pdq->pdq_cbp);
|
||||
pdq->pdq_command_info.ci_request_bufstart = (pdq_uint8_t *) pdq->pdq_dbp->pdqdb_command_pool;
|
||||
pdq->pdq_command_info.ci_response_bufstart = (pdq_uint8_t *) pdq->pdq_dbp->pdqdb_command_pool + sizeof(pdq->pdq_dbp->pdqdb_command_pool) - PDQ_SIZE_COMMAND_RESPONSE;
|
||||
pdq->pdq_rx_info.rx_buffers = (void *) pdq->pdq_dbp->pdqdb_receive_buffers;
|
||||
pdq->pdq_command_info.ci_request_bufstart = (pdq_uint8_t *) dbp->pdqdb_command_pool;
|
||||
pdq->pdq_command_info.ci_response_bufstart = (pdq_uint8_t *) dbp->pdqdb_command_pool + sizeof(dbp->pdqdb_command_pool) - PDQ_SIZE_COMMAND_RESPONSE;
|
||||
pdq->pdq_rx_info.rx_buffers = (void *) dbp->pdqdb_receive_buffers;
|
||||
|
||||
pdq->pdq_host_smt_info.rx_buffers = (void *) pdq->pdq_dbp->pdqdb_host_smt_buffers;
|
||||
pdq->pdq_host_smt_info.rx_buffers = (void *) dbp->pdqdb_host_smt_buffers;
|
||||
|
||||
PDQ_PRINTF(("\nPDQ Descriptor Block = " PDQ_OS_PTR_FMT " (PA = 0x%x)\n", pdq->pdq_dbp, pdq->pdq_pa_descriptor_block));
|
||||
PDQ_PRINTF((" Recieve Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_receives));
|
||||
PDQ_PRINTF((" Transmit Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_transmits));
|
||||
PDQ_PRINTF((" Host SMT Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_host_smt));
|
||||
PDQ_PRINTF((" Command Response Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_command_responses));
|
||||
PDQ_PRINTF((" Command Request Queue = " PDQ_OS_PTR_FMT "\n", pdq->pdq_dbp->pdqdb_command_requests));
|
||||
PDQ_PRINTF(("\nPDQ Descriptor Block = " PDQ_OS_PTR_FMT " (PA = 0x%x)\n", dbp, pdq->pdq_pa_descriptor_block));
|
||||
PDQ_PRINTF((" Recieve Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_receives));
|
||||
PDQ_PRINTF((" Transmit Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_transmits));
|
||||
PDQ_PRINTF((" Host SMT Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_host_smt));
|
||||
PDQ_PRINTF((" Command Response Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_command_responses));
|
||||
PDQ_PRINTF((" Command Request Queue = " PDQ_OS_PTR_FMT "\n", dbp->pdqdb_command_requests));
|
||||
PDQ_PRINTF(("PDQ Consumer Block = " PDQ_OS_PTR_FMT "\n", pdq->pdq_cbp));
|
||||
|
||||
/*
|
||||
|
@ -1571,7 +1577,7 @@ pdq_initialize(
|
|||
* block, command pool, and buffer pointers for the receive
|
||||
* host_smt rings.
|
||||
*/
|
||||
PDQ_OS_MEMZERO(pdq->pdq_dbp, sizeof(*pdq->pdq_dbp));
|
||||
PDQ_OS_MEMZERO(dbp, sizeof(*dbp));
|
||||
|
||||
/*
|
||||
* Initialize the CSR references.
|
||||
|
@ -1613,12 +1619,12 @@ pdq_initialize(
|
|||
* Initialize the command information block
|
||||
*/
|
||||
pdq->pdq_command_info.ci_pa_request_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_request_bufstart);
|
||||
pdq->pdq_command_info.ci_pa_request_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_command_requests);
|
||||
pdq->pdq_command_info.ci_pa_request_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_requests);
|
||||
PDQ_PRINTF(("PDQ Command Buffer = " PDQ_OS_PTR_FMT " (PA=0x%x)\n",
|
||||
pdq->pdq_command_info.ci_request_bufstart,
|
||||
pdq->pdq_command_info.ci_pa_request_bufstart));
|
||||
for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_command_requests)/sizeof(pdq->pdq_dbp->pdqdb_command_requests[0]); idx++) {
|
||||
pdq_txdesc_t *txd = &pdq->pdq_dbp->pdqdb_command_requests[idx];
|
||||
for (idx = 0; idx < sizeof(dbp->pdqdb_command_requests)/sizeof(dbp->pdqdb_command_requests[0]); idx++) {
|
||||
pdq_txdesc_t *txd = &dbp->pdqdb_command_requests[idx];
|
||||
|
||||
txd->txd_pa_lo = pdq->pdq_command_info.ci_pa_request_bufstart;
|
||||
txd->txd_eop = txd->txd_sop = 1;
|
||||
|
@ -1626,9 +1632,9 @@ pdq_initialize(
|
|||
}
|
||||
|
||||
pdq->pdq_command_info.ci_pa_response_bufstart = PDQ_DB_BUSPA(pdq, pdq->pdq_command_info.ci_response_bufstart);
|
||||
pdq->pdq_command_info.ci_pa_response_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_command_responses);
|
||||
for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_command_responses)/sizeof(pdq->pdq_dbp->pdqdb_command_responses[0]); idx++) {
|
||||
pdq_rxdesc_t *rxd = &pdq->pdq_dbp->pdqdb_command_responses[idx];
|
||||
pdq->pdq_command_info.ci_pa_response_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_command_responses);
|
||||
for (idx = 0; idx < sizeof(dbp->pdqdb_command_responses)/sizeof(dbp->pdqdb_command_responses[0]); idx++) {
|
||||
pdq_rxdesc_t *rxd = &dbp->pdqdb_command_responses[idx];
|
||||
|
||||
rxd->rxd_pa_lo = pdq->pdq_command_info.ci_pa_response_bufstart;
|
||||
rxd->rxd_sop = 1;
|
||||
|
@ -1636,19 +1642,19 @@ pdq_initialize(
|
|||
rxd->rxd_seg_len_lo = 0;
|
||||
rxd->rxd_seg_len_hi = PDQ_SIZE_COMMAND_RESPONSE / 16;
|
||||
}
|
||||
PDQ_OS_DESC_PRESYNC(pdq, pdq->pdq_dbp->pdqdb_command_responses,
|
||||
sizeof(pdq->pdq_dbp->pdqdb_command_responses));
|
||||
PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_command_responses,
|
||||
sizeof(dbp->pdqdb_command_responses));
|
||||
|
||||
/*
|
||||
* Initialize the unsolicited event information block
|
||||
*/
|
||||
pdq->pdq_unsolicited_info.ui_free = PDQ_NUM_UNSOLICITED_EVENTS;
|
||||
pdq->pdq_unsolicited_info.ui_pa_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_unsolicited_events);
|
||||
pdq->pdq_unsolicited_info.ui_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_unsolicited_events);
|
||||
PDQ_PRINTF(("PDQ Unsolicit Event Buffer = " PDQ_OS_PTR_FMT " (PA=0x%x)\n",
|
||||
pdq->pdq_unsolicited_info.ui_events,
|
||||
pdq->pdq_unsolicited_info.ui_pa_bufstart));
|
||||
for (idx = 0; idx < sizeof(pdq->pdq_dbp->pdqdb_unsolicited_events)/sizeof(pdq->pdq_dbp->pdqdb_unsolicited_events[0]); idx++) {
|
||||
pdq_rxdesc_t *rxd = &pdq->pdq_dbp->pdqdb_unsolicited_events[idx];
|
||||
for (idx = 0; idx < sizeof(dbp->pdqdb_unsolicited_events)/sizeof(dbp->pdqdb_unsolicited_events[0]); idx++) {
|
||||
pdq_rxdesc_t *rxd = &dbp->pdqdb_unsolicited_events[idx];
|
||||
pdq_unsolicited_event_t *event = &pdq->pdq_unsolicited_info.ui_events[idx & (PDQ_NUM_UNSOLICITED_EVENTS-1)];
|
||||
|
||||
rxd->rxd_sop = 1;
|
||||
|
@ -1659,31 +1665,31 @@ pdq_initialize(
|
|||
rxd->rxd_pa_hi = 0;
|
||||
PDQ_OS_UNSOL_EVENT_PRESYNC(pdq, event);
|
||||
}
|
||||
PDQ_OS_DESC_PRESYNC(pdq, pdq->pdq_dbp->pdqdb_unsolicited_events,
|
||||
sizeof(pdq->pdq_dbp->pdqdb_unsolicited_events));
|
||||
PDQ_OS_DESC_PRESYNC(pdq, dbp->pdqdb_unsolicited_events,
|
||||
sizeof(dbp->pdqdb_unsolicited_events));
|
||||
|
||||
/*
|
||||
* Initialize the receive information blocks (normal and SMT).
|
||||
*/
|
||||
pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_receives);
|
||||
pdq->pdq_rx_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_receives);
|
||||
pdq->pdq_rx_info.rx_target = pdq->pdq_rx_info.rx_free - PDQ_RX_SEGCNT * 8;
|
||||
pdq->pdq_rx_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_receives);
|
||||
pdq->pdq_rx_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_receives);
|
||||
|
||||
pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_host_smt);
|
||||
pdq->pdq_host_smt_info.rx_free = PDQ_RING_MASK(dbp->pdqdb_host_smt);
|
||||
pdq->pdq_host_smt_info.rx_target = pdq->pdq_host_smt_info.rx_free - PDQ_RX_SEGCNT * 3;
|
||||
pdq->pdq_host_smt_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_host_smt);
|
||||
pdq->pdq_host_smt_info.rx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_host_smt);
|
||||
|
||||
/*
|
||||
* Initialize the transmit information block.
|
||||
*/
|
||||
pdq->pdq_dbp->pdqdb_tx_hdr[0] = PDQ_FDDI_PH0;
|
||||
pdq->pdq_dbp->pdqdb_tx_hdr[1] = PDQ_FDDI_PH1;
|
||||
pdq->pdq_dbp->pdqdb_tx_hdr[2] = PDQ_FDDI_PH2;
|
||||
pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(pdq->pdq_dbp->pdqdb_transmits);
|
||||
pdq->pdq_tx_info.tx_hdrdesc.txd_seg_len = sizeof(pdq->pdq_dbp->pdqdb_tx_hdr);
|
||||
dbp->pdqdb_tx_hdr[0] = PDQ_FDDI_PH0;
|
||||
dbp->pdqdb_tx_hdr[1] = PDQ_FDDI_PH1;
|
||||
dbp->pdqdb_tx_hdr[2] = PDQ_FDDI_PH2;
|
||||
pdq->pdq_tx_info.tx_free = PDQ_RING_MASK(dbp->pdqdb_transmits);
|
||||
pdq->pdq_tx_info.tx_hdrdesc.txd_seg_len = 3;
|
||||
pdq->pdq_tx_info.tx_hdrdesc.txd_sop = 1;
|
||||
pdq->pdq_tx_info.tx_hdrdesc.txd_pa_lo = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_tx_hdr);
|
||||
pdq->pdq_tx_info.tx_pa_descriptors = PDQ_DB_BUSPA(pdq, pdq->pdq_dbp->pdqdb_transmits);
|
||||
pdq->pdq_tx_info.tx_hdrdesc.txd_pa_lo = PDQ_DB_BUSPA(pdq, dbp->pdqdb_tx_hdr);
|
||||
pdq->pdq_tx_info.tx_pa_descriptors = PDQ_DB_BUSPA(pdq, dbp->pdqdb_transmits);
|
||||
|
||||
state = PDQ_PSTS_ADAPTER_STATE(PDQ_CSR_READ(&pdq->pdq_csrs, csr_port_status));
|
||||
PDQ_PRINTF(("PDQ Adapter State = %s\n", pdq_adapter_states[state]));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pdq_ifsubr.c,v 1.13 1998/05/21 20:44:02 matt Exp $ */
|
||||
/* $NetBSD: pdq_ifsubr.c,v 1.14 1998/05/24 21:40:06 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
|
||||
|
@ -185,37 +185,32 @@ pdq_ifstart(
|
|||
return;
|
||||
}
|
||||
for (;; tx = 1) {
|
||||
#if defined(PDQ_BUS_DMA) && !defined(PDQ_BUS_DMA_NOTX)
|
||||
bus_dmamap_t map;
|
||||
#endif
|
||||
IF_DEQUEUE(ifq, m);
|
||||
if (m == NULL)
|
||||
break;
|
||||
#if defined(PDQ_BUS_DMA) && !defined(PDQ_BUS_DMA_NOTX)
|
||||
if (m->m_flags & M_HASDMAMAP) {
|
||||
map = M_GETCTX(m, bus_dmamap_t);
|
||||
} else {
|
||||
map = NULL;
|
||||
if (!bus_dmamap_create(sc->sc_dmatag, 0x1FFF, 255, 0x1FFF, 0, BUS_DMA_NOWAIT, &map)) {
|
||||
if ((m->m_flags & M_HASTXDMAMAP) == 0) {
|
||||
bus_dmamap_t map;
|
||||
if (!bus_dmamap_create(sc->sc_dmatag, m->m_pkthdr.len, 255,
|
||||
m->m_pkthdr.len, 0, BUS_DMA_NOWAIT, &map)) {
|
||||
if (!bus_dmamap_load_mbuf(sc->sc_dmatag, map, m, BUS_DMA_NOWAIT)) {
|
||||
bus_dmamap_sync(sc->sc_dmatag, map, 0, m->m_pkthdr.len, BUS_DMASYNC_PREWRITE);
|
||||
bus_dmamap_sync(sc->sc_dmatag, map, 0, m->m_pkthdr.len,
|
||||
BUS_DMASYNC_PREWRITE);
|
||||
M_SETCTX(m, map);
|
||||
m->m_flags |= M_HASDMAMAP;
|
||||
m->m_flags |= M_HASTXDMAMAP;
|
||||
}
|
||||
}
|
||||
if ((m->m_flags & M_HASDMAMAP) == 0) {
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
IF_PREPEND(ifq, m);
|
||||
if ((m->m_flags & M_HASTXDMAMAP) == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (pdq_queue_transmit_data(sc->sc_pdq, m) == PDQ_FALSE) {
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
IF_PREPEND(ifq, m);
|
||||
if (pdq_queue_transmit_data(sc->sc_pdq, m) == PDQ_FALSE)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (m != NULL) {
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
IF_PREPEND(ifq, m);
|
||||
}
|
||||
if (tx)
|
||||
PDQ_DO_TYPE2_PRODUCER(sc->sc_pdq);
|
||||
|
@ -232,13 +227,25 @@ pdq_os_receive_pdu(
|
|||
struct fddi_header *fh = mtod(m, struct fddi_header *);
|
||||
|
||||
sc->sc_if.if_ipackets++;
|
||||
#if NBPFILTER > 0
|
||||
#if defined(PDQ_BUS_MAP)
|
||||
pdq_os_databuf_sync(sc, m, 0, pktlen, BUS_DMASYNC_POSTREAD);
|
||||
bus_dmamap_unload(sc->sc_dmatag, M_GETCTX(m, bus_dmamap_t));
|
||||
bus_dmamap_destroy(sc->sc_dmatag, M_GETCTX(m, bus_dmamap_t));
|
||||
m->m_flags &= ~M_HASDMAMAP;
|
||||
#if defined(PDQ_BUS_DMA)
|
||||
{
|
||||
/*
|
||||
* Even though the first mbuf start at the frame control octet,
|
||||
* the dmamap PDQ_RX_FC_OFFSET octets earlier. Any additional
|
||||
* mbufs will start normally.
|
||||
*/
|
||||
int offset = PDQ_RX_FC_OFFSET;
|
||||
struct mbuf *m0;
|
||||
for (m0 = m; m0 != NULL; m0 = m0->m_next, offset = 0) {
|
||||
pdq_os_databuf_sync(sc, m0, offset, m0->m_len, BUS_DMASYNC_POSTREAD);
|
||||
bus_dmamap_unload(sc->sc_dmatag, M_GETCTX(m0, bus_dmamap_t));
|
||||
bus_dmamap_destroy(sc->sc_dmatag, M_GETCTX(m0, bus_dmamap_t));
|
||||
m0->m_flags &= ~M_HASRXDMAMAP;
|
||||
M_SETCTX(m0, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if NBPFILTER > 0
|
||||
if (sc->sc_bpf != NULL)
|
||||
PDQ_BPF_MTAP(sc, m);
|
||||
#endif
|
||||
|
@ -246,12 +253,6 @@ pdq_os_receive_pdu(
|
|||
PDQ_OS_DATABUF_FREE(pdq, m);
|
||||
return;
|
||||
}
|
||||
#if NBPFILTER == 0 && defined(PDQ_BUS_MAP)
|
||||
pdq_os_databuf_sync(sc, m, 0, pktlen, BUS_DMASYNC_POSTREAD);
|
||||
bus_dmamap_unload(sc->sc_dmatag, M_GETCTX(m, bus_dmamap_t));
|
||||
bus_dmamap_destroy(sc->sc_dmatag, M_GETCTX(m, bus_dmamap_t));
|
||||
m->m_flags &= ~M_HASDMAMAP;
|
||||
#endif
|
||||
|
||||
m->m_data += sizeof(struct fddi_header);
|
||||
m->m_len -= sizeof(struct fddi_header);
|
||||
|
@ -704,11 +705,11 @@ pdq_os_databuf_free(
|
|||
pdq_os_ctx_t *sc,
|
||||
struct mbuf *m)
|
||||
{
|
||||
if (m->m_flags & M_HASDMAMAP) {
|
||||
if (m->m_flags & (M_HASRXDMAMAP|M_HASTXDMAMAP)) {
|
||||
bus_dmamap_t map = M_GETCTX(m, bus_dmamap_t);
|
||||
bus_dmamap_unload(sc->sc_dmatag, map);
|
||||
bus_dmamap_destroy(sc->sc_dmatag, map);
|
||||
m->m_flags ^= M_HASDMAMAP;
|
||||
m->m_flags &= ~(M_HASRXDMAMAP|M_HASTXDMAMAP);
|
||||
}
|
||||
m_freem(m);
|
||||
}
|
||||
|
@ -721,26 +722,31 @@ pdq_os_databuf_alloc(
|
|||
bus_dmamap_t map;
|
||||
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
if (m == NULL)
|
||||
if (m == NULL) {
|
||||
printf("%s: can't alloc small buf\n", sc->sc_dev.dv_xname);
|
||||
return NULL;
|
||||
}
|
||||
MCLGET(m, M_DONTWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
printf("%s: can't alloc cluster\n", sc->sc_dev.dv_xname);
|
||||
m_free(m);
|
||||
return NULL;
|
||||
}
|
||||
m->m_len = PDQ_OS_DATABUF_SIZE;
|
||||
m->m_pkthdr.len = m->m_len = PDQ_OS_DATABUF_SIZE;
|
||||
|
||||
if (!bus_dmamap_create(sc->sc_dmatag, PDQ_OS_DATABUF_SIZE,
|
||||
if (bus_dmamap_create(sc->sc_dmatag, PDQ_OS_DATABUF_SIZE,
|
||||
1, PDQ_OS_DATABUF_SIZE, 0, BUS_DMA_NOWAIT, &map)) {
|
||||
printf("%s: can't create dmamap\n", sc->sc_dev.dv_xname);
|
||||
m_free(m);
|
||||
return NULL;
|
||||
}
|
||||
if (!bus_dmamap_load_mbuf(sc->sc_dmatag, map, m, BUS_DMA_NOWAIT)) {
|
||||
if (bus_dmamap_load_mbuf(sc->sc_dmatag, map, m, BUS_DMA_NOWAIT)) {
|
||||
printf("%s: can't load dmamap\n", sc->sc_dev.dv_xname);
|
||||
bus_dmamap_destroy(sc->sc_dmatag, map);
|
||||
m_free(m);
|
||||
return NULL;
|
||||
}
|
||||
m->m_flags |= M_HASDMAMAP;
|
||||
m->m_flags |= M_HASRXDMAMAP;
|
||||
M_SETCTX(m, map);
|
||||
return m;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pdqvar.h,v 1.17 1998/05/21 20:44:02 matt Exp $ */
|
||||
/* $NetBSD: pdqvar.h,v 1.18 1998/05/24 21:40:05 matt Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com>
|
||||
|
@ -217,7 +217,7 @@ typedef bus_addr_t pdq_bus_memoffset_t;
|
|||
pdq_os_databuf_sync((pdq)->pdq_os_ctx, (b), (o), (l), \
|
||||
BUS_DMASYNC_POSTREAD)
|
||||
#define PDQ_OS_DATABUF_ALLOC(pdq, b) ((void)((b) = pdq_os_databuf_alloc((pdq)->pdq_os_ctx)))
|
||||
#define PDQ_OS_DATABUF_FREE(pdq, b) pdq_os_databuf_free((pdq)->pdq_os_ctx, b)
|
||||
#define PDQ_OS_DATABUF_FREE(pdq, b) pdq_os_databuf_free((pdq)->pdq_os_ctx, (b))
|
||||
#define PDQ_OS_DATABUF_BUSPA(pdq, b) (M_GETCTX((b), bus_dmamap_t)->dm_segs[0].ds_addr + 0)
|
||||
struct _pdq_os_ctx_t;
|
||||
extern void pdq_os_descriptor_block_sync(struct _pdq_os_ctx_t *osctx, size_t offset,
|
||||
|
@ -228,7 +228,8 @@ extern struct mbuf *pdq_os_databuf_alloc(struct _pdq_os_ctx_t *osctx);
|
|||
extern void pdq_os_databuf_sync(struct _pdq_os_ctx_t *osctx, struct mbuf *b,
|
||||
size_t offset, size_t length, int ops);
|
||||
extern void pdq_os_databuf_free(struct _pdq_os_ctx_t *osctx, struct mbuf *m);
|
||||
#define M_HASDMAMAP M_LINK2
|
||||
#define M_HASTXDMAMAP M_LINK1
|
||||
#define M_HASRXDMAMAP M_LINK2
|
||||
#endif
|
||||
|
||||
#define PDQ_CSR_WRITE(csr, name, data) PDQ_OS_IOWR_32((csr)->csr_bus, (csr)->csr_base, (csr)->name, data)
|
||||
|
@ -339,6 +340,7 @@ typedef struct _pdq_os_ctx_t {
|
|||
#endif
|
||||
bus_dmamap_t sc_dbmap; /* DMA map for descriptor block */
|
||||
bus_dmamap_t sc_uimap; /* DMA map for unsolicited events */
|
||||
bus_dmamap_t sc_cbmap; /* DMA map for consumer block */
|
||||
#endif
|
||||
} pdq_softc_t;
|
||||
|
||||
|
|
Loading…
Reference in New Issue