Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: msk(4) require to sync status buffer
> I tried variously today. And, neither patch seems to be also appropriate.
> For instance, I logged in other hosts with ssh(1) and executed 'ls -R /'.
> The response died after it had operated for a while. This msk(4) was not
> able to be communicated after this. X-<
>
> Synchronous timing seems not to be correct yet.
Sorry, there is a botch in the previous one.
---
Izumi Tsutsui
Index: if_msk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_msk.c,v
retrieving revision 1.16
diff -u -r1.16 if_msk.c
--- if_msk.c 7 Feb 2008 01:21:56 -0000 1.16
+++ if_msk.c 10 Mar 2008 13:21:13 -0000
@@ -893,6 +893,8 @@
/* Reset status ring. */
bzero((char *)sc->sk_status_ring,
MSK_STATUS_RING_CNT * sizeof(struct msk_status_desc));
+ bus_dmamap_sync(sc->sc_dmatag, sc->sk_status_map, 0,
+ sc->sk_status_map->dm_mapsize, BUS_DMASYNC_PREREAD);
sc->sk_status_idx = 0;
sk_win_write_4(sc, SK_STAT_BMU_CSR, SK_STAT_BMU_RESET);
@@ -1256,8 +1258,6 @@
goto fail_5;
}
sc->sk_status_ring = (struct msk_status_desc *)kva;
- bzero(sc->sk_status_ring,
- MSK_STATUS_RING_CNT * sizeof(struct msk_status_desc));
/* Reset the adapter. */
msk_reset(sc);
@@ -1741,11 +1741,12 @@
if (sc_if->sk_cdata.sk_tx_cnt <= 0)
break;
prog++;
+ cur_tx = &sc_if->sk_rdata->sk_tx_ring[cons];
+
MSK_CDTXSYNC(sc_if, cons, 1,
BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
-
- cur_tx = &sc_if->sk_rdata->sk_tx_ring[cons];
sk_ctl = cur_tx->sk_ctl;
+ MSK_CDTXSYNC(sc_if, cons, 1, BUS_DMASYNC_PREREAD);
#ifdef MSK_DEBUG
if (mskdebug >= 2)
msk_dump_txdesc(cur_tx, cons);
@@ -1816,6 +1817,9 @@
struct ifnet *ifp0 = NULL, *ifp1 = NULL;
int claimed = 0;
u_int32_t status;
+ uint32_t st_status;
+ uint16_t st_len;
+ uint8_t st_opcode, st_link;
struct msk_status_desc *cur_st;
status = CSR_READ_4(sc, SK_Y2_ISSR2);
@@ -1841,42 +1845,46 @@
msk_intr_yukon(sc_if1);
}
- MSK_CDSTSYNC(sc, sc->sk_status_idx,
- BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
- cur_st = &sc->sk_status_ring[sc->sk_status_idx];
-
- while (cur_st->sk_opcode & SK_Y2_STOPC_OWN) {
- cur_st->sk_opcode &= ~SK_Y2_STOPC_OWN;
- switch (cur_st->sk_opcode) {
+ for (;;) {
+ cur_st = &sc->sk_status_ring[sc->sk_status_idx];
+ MSK_CDSTSYNC(sc, sc->sk_status_idx,
+ BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
+ st_opcode = cur_st->sk_opcode;
+ if ((st_opcode & SK_Y2_STOPC_OWN) == 0) {
+ MSK_CDSTSYNC(sc, sc->sk_status_idx,
+ BUS_DMASYNC_PREREAD);
+ break;
+ }
+ st_status = le32toh(cur_st->sk_status);
+ st_len = le16toh(cur_st->sk_len);
+ st_link = cur_st->sk_link;
+ st_opcode &= ~SK_Y2_STOPC_OWN;
+ cur_st->sk_opcode = st_opcode;
+ MSK_CDSTSYNC(sc, sc->sk_status_idx,
+ BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
+
+ switch (st_opcode) {
case SK_Y2_STOPC_RXSTAT:
- msk_rxeof(sc->sk_if[cur_st->sk_link],
- letoh16(cur_st->sk_len),
- letoh32(cur_st->sk_status));
- SK_IF_WRITE_2(sc->sk_if[cur_st->sk_link], 0,
+ msk_rxeof(sc->sk_if[st_link], st_len, st_status);
+ SK_IF_WRITE_2(sc->sk_if[st_link], 0,
SK_RXQ1_Y2_PREF_PUTIDX,
- sc->sk_if[cur_st->sk_link]->sk_cdata.sk_rx_prod);
+ sc->sk_if[st_link]->sk_cdata.sk_rx_prod);
break;
case SK_Y2_STOPC_TXSTAT:
if (sc_if0)
- msk_txeof(sc_if0,
- letoh32(cur_st->sk_status)
+ msk_txeof(sc_if0, st_status
& SK_Y2_ST_TXA1_MSKL);
if (sc_if1)
msk_txeof(sc_if1,
- ((letoh32(cur_st->sk_status)
- & SK_Y2_ST_TXA2_MSKL)
+ ((st_status & SK_Y2_ST_TXA2_MSKL)
>> SK_Y2_ST_TXA2_SHIFTL)
- | ((letoh16(cur_st->sk_len) &
SK_Y2_ST_TXA2_MSKH) << SK_Y2_ST_TXA2_SHIFTH));
+ | ((st_len & SK_Y2_ST_TXA2_MSKH) <<
SK_Y2_ST_TXA2_SHIFTH));
break;
default:
- aprint_error("opcode=0x%x\n", cur_st->sk_opcode);
+ aprint_error("opcode=0x%x\n", st_opcode);
break;
}
SK_INC(sc->sk_status_idx, MSK_STATUS_RING_CNT);
-
- MSK_CDSTSYNC(sc, sc->sk_status_idx,
- BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
- cur_st = &sc->sk_status_ring[sc->sk_status_idx];
}
if (status & SK_Y2_IMR_BMU) {
Home |
Main Index |
Thread Index |
Old Index