1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-14 10:09:48 +00:00

- Use if_printf() and device_printf() and remove vr_unit from the softc.

I had to initialize the ifnet a bit earlier in attach so that the
  if_printf()'s in vr_reset() didn't explode with a page fault.
- Use M_ZERO with contigmalloc() rather than an explicit bzero.
This commit is contained in:
John Baldwin 2005-10-27 21:18:37 +00:00
parent 2bf266e6da
commit 4cc88f8f33
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=151773
4 changed files with 88 additions and 106 deletions

View File

@ -592,7 +592,7 @@ vr_reset(struct vr_softc *sc)
{
register int i;
/*VR_LOCK_ASSERT(sc);*/ /* XXX: Called during detach w/o lock. */
/*VR_LOCK_ASSERT(sc);*/ /* XXX: Called during attach w/o lock. */
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RESET);
@ -603,11 +603,10 @@ vr_reset(struct vr_softc *sc)
}
if (i == VR_TIMEOUT) {
if (sc->vr_revid < REV_ID_VT3065_A)
printf("vr%d: reset never completed!\n", sc->vr_unit);
if_printf(sc->vr_ifp, "reset never completed!\n");
else {
/* Use newer force reset command */
printf("vr%d: Using force reset command.\n",
sc->vr_unit);
if_printf(sc->vr_ifp, "Using force reset command.\n");
VR_SETBIT(sc, VR_MISC_CR1, VR_MISCCR1_FORSRST);
}
}
@ -666,7 +665,7 @@ vr_attach(dev)
sc->vr_res = bus_alloc_resource_any(dev, VR_RES, &rid, RF_ACTIVE);
if (sc->vr_res == NULL) {
printf("vr%d: couldn't map ports/memory\n", unit);
device_printf(dev, "couldn't map ports/memory\n");
error = ENXIO;
goto fail;
}
@ -680,11 +679,35 @@ vr_attach(dev)
RF_SHAREABLE | RF_ACTIVE);
if (sc->vr_irq == NULL) {
printf("vr%d: couldn't map interrupt\n", unit);
device_printf(dev, "couldn't map interrupt\n");
error = ENXIO;
goto fail;
}
/* Allocate ifnet structure. */
ifp = sc->vr_ifp = if_alloc(IFT_ETHER);
if (ifp == NULL) {
device_printf(dev, "can not if_alloc()\n");
error = ENOSPC;
goto fail;
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = vr_ioctl;
ifp->if_start = vr_start;
ifp->if_watchdog = vr_watchdog;
ifp->if_init = vr_init;
ifp->if_baudrate = 10000000;
IFQ_SET_MAXLEN(&ifp->if_snd, VR_TX_LIST_CNT - 1);
ifp->if_snd.ifq_maxlen = VR_TX_LIST_CNT - 1;
IFQ_SET_READY(&ifp->if_snd);
ifp->if_capenable = ifp->if_capabilities;
#ifdef DEVICE_POLLING
ifp->if_capabilities |= IFCAP_POLLING;
#endif
/*
* Windows may put the chip in suspend mode when it
* shuts down. Be sure to kick it in the head to wake it
@ -715,46 +738,19 @@ vr_attach(dev)
for (i = 0; i < ETHER_ADDR_LEN; i++)
eaddr[i] = CSR_READ_1(sc, VR_PAR0 + i);
sc->vr_unit = unit;
sc->vr_ldata = contigmalloc(sizeof(struct vr_list_data), M_DEVBUF,
M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0);
M_NOWAIT | M_ZERO, 0, 0xffffffff, PAGE_SIZE, 0);
if (sc->vr_ldata == NULL) {
printf("vr%d: no memory for list buffers!\n", unit);
device_printf(dev, "no memory for list buffers!\n");
error = ENXIO;
goto fail;
}
bzero(sc->vr_ldata, sizeof(struct vr_list_data));
ifp = sc->vr_ifp = if_alloc(IFT_ETHER);
if (ifp == NULL) {
printf("vr%d: can not if_alloc()\n", unit);
error = ENOSPC;
goto fail;
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = vr_ioctl;
ifp->if_start = vr_start;
ifp->if_watchdog = vr_watchdog;
ifp->if_init = vr_init;
ifp->if_baudrate = 10000000;
IFQ_SET_MAXLEN(&ifp->if_snd, VR_TX_LIST_CNT - 1);
ifp->if_snd.ifq_maxlen = VR_TX_LIST_CNT - 1;
IFQ_SET_READY(&ifp->if_snd);
ifp->if_capenable = ifp->if_capabilities;
#ifdef DEVICE_POLLING
ifp->if_capabilities |= IFCAP_POLLING;
#endif
/* Do MII setup. */
if (mii_phy_probe(dev, &sc->vr_miibus,
vr_ifmedia_upd, vr_ifmedia_sts)) {
printf("vr%d: MII without any phy!\n", sc->vr_unit);
device_printf(dev, "MII without any phy!\n");
error = ENXIO;
goto fail;
}
@ -771,7 +767,7 @@ vr_attach(dev)
vr_intr, sc, &sc->vr_intrhand);
if (error) {
printf("vr%d: couldn't set up irq\n", unit);
device_printf(dev, "couldn't set up irq\n");
ether_ifdetach(ifp);
goto fail;
}
@ -981,8 +977,7 @@ vr_rxeof(struct vr_softc *sc)
*/
if (rxstat & VR_RXSTAT_RXERR) {
ifp->if_ierrors++;
printf("vr%d: rx error (%02x):", sc->vr_unit,
rxstat & 0x000000ff);
if_printf(ifp, "rx error (%02x):", rxstat & 0x000000ff);
if (rxstat & VR_RXSTAT_CRCERR)
printf(" crc error");
if (rxstat & VR_RXSTAT_FRAMEALIGNERR)
@ -1051,7 +1046,7 @@ vr_rxeoc(struct vr_softc *sc)
}
if (!i) {
printf("vr%d: rx shutdown error!\n", sc->vr_unit);
if_printf(ifp, "rx shutdown error!\n");
sc->vr_flags |= VR_F_RESTART;
return;
}
@ -1093,8 +1088,7 @@ vr_txeof(struct vr_softc *sc)
i--)
; /* Wait for chip to shutdown */
if (!i) {
printf("vr%d: tx shutdown timeout\n",
sc->vr_unit);
if_printf(ifp, "tx shutdown timeout\n");
sc->vr_flags |= VR_F_RESTART;
break;
}
@ -1137,7 +1131,7 @@ vr_tick(void *xsc)
VR_LOCK(sc);
if (sc->vr_flags & VR_F_RESTART) {
printf("vr%d: restarting\n", sc->vr_unit);
if_printf(sc->vr_ifp, "restarting\n");
vr_stop(sc);
vr_reset(sc);
vr_init_locked(sc);
@ -1191,14 +1185,13 @@ vr_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
return;
if (status & VR_ISR_RX_DROPPED) {
printf("vr%d: rx packet lost\n", sc->vr_unit);
if_printf(ifp, "rx packet lost\n");
ifp->if_ierrors++;
}
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) ||
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW)) {
printf("vr%d: receive error (%04x)",
sc->vr_unit, status);
if_printf(ifp, "receive error (%04x)", status);
if (status & VR_ISR_RX_NOBUF)
printf(" no buffers");
if (status & VR_ISR_RX_OFLOW)
@ -1274,14 +1267,13 @@ vr_intr(void *arg)
vr_rxeof(sc);
if (status & VR_ISR_RX_DROPPED) {
printf("vr%d: rx packet lost\n", sc->vr_unit);
if_printf(ifp, "rx packet lost\n");
ifp->if_ierrors++;
}
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) ||
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW)) {
printf("vr%d: receive error (%04x)",
sc->vr_unit, status);
if_printf(ifp, "receive error (%04x)", status);
if (status & VR_ISR_RX_NOBUF)
printf(" no buffers");
if (status & VR_ISR_RX_OFLOW)
@ -1483,8 +1475,8 @@ vr_init_locked(struct vr_softc *sc)
/* Init circular RX list. */
if (vr_list_rx_init(sc) == ENOBUFS) {
printf(
"vr%d: initialization failed: no memory for rx buffers\n", sc->vr_unit);
if_printf(ifp,
"initialization failed: no memory for rx buffers\n");
vr_stop(sc);
return;
}
@ -1649,7 +1641,7 @@ vr_watchdog(struct ifnet *ifp)
VR_LOCK(sc);
ifp->if_oerrors++;
printf("vr%d: watchdog timeout\n", sc->vr_unit);
if_printf(ifp, "watchdog timeout\n");
vr_stop(sc);
vr_reset(sc);

View File

@ -460,7 +460,6 @@ struct vr_softc {
void *vr_intrhand;
device_t vr_miibus;
struct vr_type *vr_info; /* Rhine adapter info */
u_int8_t vr_unit; /* interface number */
u_int8_t vr_type;
u_int8_t vr_revid; /* Rhine chip revision */
u_int8_t vr_flags; /* See VR_F_* below */

View File

@ -592,7 +592,7 @@ vr_reset(struct vr_softc *sc)
{
register int i;
/*VR_LOCK_ASSERT(sc);*/ /* XXX: Called during detach w/o lock. */
/*VR_LOCK_ASSERT(sc);*/ /* XXX: Called during attach w/o lock. */
VR_SETBIT16(sc, VR_COMMAND, VR_CMD_RESET);
@ -603,11 +603,10 @@ vr_reset(struct vr_softc *sc)
}
if (i == VR_TIMEOUT) {
if (sc->vr_revid < REV_ID_VT3065_A)
printf("vr%d: reset never completed!\n", sc->vr_unit);
if_printf(sc->vr_ifp, "reset never completed!\n");
else {
/* Use newer force reset command */
printf("vr%d: Using force reset command.\n",
sc->vr_unit);
if_printf(sc->vr_ifp, "Using force reset command.\n");
VR_SETBIT(sc, VR_MISC_CR1, VR_MISCCR1_FORSRST);
}
}
@ -666,7 +665,7 @@ vr_attach(dev)
sc->vr_res = bus_alloc_resource_any(dev, VR_RES, &rid, RF_ACTIVE);
if (sc->vr_res == NULL) {
printf("vr%d: couldn't map ports/memory\n", unit);
device_printf(dev, "couldn't map ports/memory\n");
error = ENXIO;
goto fail;
}
@ -680,11 +679,35 @@ vr_attach(dev)
RF_SHAREABLE | RF_ACTIVE);
if (sc->vr_irq == NULL) {
printf("vr%d: couldn't map interrupt\n", unit);
device_printf(dev, "couldn't map interrupt\n");
error = ENXIO;
goto fail;
}
/* Allocate ifnet structure. */
ifp = sc->vr_ifp = if_alloc(IFT_ETHER);
if (ifp == NULL) {
device_printf(dev, "can not if_alloc()\n");
error = ENOSPC;
goto fail;
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = vr_ioctl;
ifp->if_start = vr_start;
ifp->if_watchdog = vr_watchdog;
ifp->if_init = vr_init;
ifp->if_baudrate = 10000000;
IFQ_SET_MAXLEN(&ifp->if_snd, VR_TX_LIST_CNT - 1);
ifp->if_snd.ifq_maxlen = VR_TX_LIST_CNT - 1;
IFQ_SET_READY(&ifp->if_snd);
ifp->if_capenable = ifp->if_capabilities;
#ifdef DEVICE_POLLING
ifp->if_capabilities |= IFCAP_POLLING;
#endif
/*
* Windows may put the chip in suspend mode when it
* shuts down. Be sure to kick it in the head to wake it
@ -715,46 +738,19 @@ vr_attach(dev)
for (i = 0; i < ETHER_ADDR_LEN; i++)
eaddr[i] = CSR_READ_1(sc, VR_PAR0 + i);
sc->vr_unit = unit;
sc->vr_ldata = contigmalloc(sizeof(struct vr_list_data), M_DEVBUF,
M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0);
M_NOWAIT | M_ZERO, 0, 0xffffffff, PAGE_SIZE, 0);
if (sc->vr_ldata == NULL) {
printf("vr%d: no memory for list buffers!\n", unit);
device_printf(dev, "no memory for list buffers!\n");
error = ENXIO;
goto fail;
}
bzero(sc->vr_ldata, sizeof(struct vr_list_data));
ifp = sc->vr_ifp = if_alloc(IFT_ETHER);
if (ifp == NULL) {
printf("vr%d: can not if_alloc()\n", unit);
error = ENOSPC;
goto fail;
}
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = vr_ioctl;
ifp->if_start = vr_start;
ifp->if_watchdog = vr_watchdog;
ifp->if_init = vr_init;
ifp->if_baudrate = 10000000;
IFQ_SET_MAXLEN(&ifp->if_snd, VR_TX_LIST_CNT - 1);
ifp->if_snd.ifq_maxlen = VR_TX_LIST_CNT - 1;
IFQ_SET_READY(&ifp->if_snd);
ifp->if_capenable = ifp->if_capabilities;
#ifdef DEVICE_POLLING
ifp->if_capabilities |= IFCAP_POLLING;
#endif
/* Do MII setup. */
if (mii_phy_probe(dev, &sc->vr_miibus,
vr_ifmedia_upd, vr_ifmedia_sts)) {
printf("vr%d: MII without any phy!\n", sc->vr_unit);
device_printf(dev, "MII without any phy!\n");
error = ENXIO;
goto fail;
}
@ -771,7 +767,7 @@ vr_attach(dev)
vr_intr, sc, &sc->vr_intrhand);
if (error) {
printf("vr%d: couldn't set up irq\n", unit);
device_printf(dev, "couldn't set up irq\n");
ether_ifdetach(ifp);
goto fail;
}
@ -981,8 +977,7 @@ vr_rxeof(struct vr_softc *sc)
*/
if (rxstat & VR_RXSTAT_RXERR) {
ifp->if_ierrors++;
printf("vr%d: rx error (%02x):", sc->vr_unit,
rxstat & 0x000000ff);
if_printf(ifp, "rx error (%02x):", rxstat & 0x000000ff);
if (rxstat & VR_RXSTAT_CRCERR)
printf(" crc error");
if (rxstat & VR_RXSTAT_FRAMEALIGNERR)
@ -1051,7 +1046,7 @@ vr_rxeoc(struct vr_softc *sc)
}
if (!i) {
printf("vr%d: rx shutdown error!\n", sc->vr_unit);
if_printf(ifp, "rx shutdown error!\n");
sc->vr_flags |= VR_F_RESTART;
return;
}
@ -1093,8 +1088,7 @@ vr_txeof(struct vr_softc *sc)
i--)
; /* Wait for chip to shutdown */
if (!i) {
printf("vr%d: tx shutdown timeout\n",
sc->vr_unit);
if_printf(ifp, "tx shutdown timeout\n");
sc->vr_flags |= VR_F_RESTART;
break;
}
@ -1137,7 +1131,7 @@ vr_tick(void *xsc)
VR_LOCK(sc);
if (sc->vr_flags & VR_F_RESTART) {
printf("vr%d: restarting\n", sc->vr_unit);
if_printf(sc->vr_ifp, "restarting\n");
vr_stop(sc);
vr_reset(sc);
vr_init_locked(sc);
@ -1191,14 +1185,13 @@ vr_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count)
return;
if (status & VR_ISR_RX_DROPPED) {
printf("vr%d: rx packet lost\n", sc->vr_unit);
if_printf(ifp, "rx packet lost\n");
ifp->if_ierrors++;
}
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) ||
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW)) {
printf("vr%d: receive error (%04x)",
sc->vr_unit, status);
if_printf(ifp, "receive error (%04x)", status);
if (status & VR_ISR_RX_NOBUF)
printf(" no buffers");
if (status & VR_ISR_RX_OFLOW)
@ -1274,14 +1267,13 @@ vr_intr(void *arg)
vr_rxeof(sc);
if (status & VR_ISR_RX_DROPPED) {
printf("vr%d: rx packet lost\n", sc->vr_unit);
if_printf(ifp, "rx packet lost\n");
ifp->if_ierrors++;
}
if ((status & VR_ISR_RX_ERR) || (status & VR_ISR_RX_NOBUF) ||
(status & VR_ISR_RX_NOBUF) || (status & VR_ISR_RX_OFLOW)) {
printf("vr%d: receive error (%04x)",
sc->vr_unit, status);
if_printf(ifp, "receive error (%04x)", status);
if (status & VR_ISR_RX_NOBUF)
printf(" no buffers");
if (status & VR_ISR_RX_OFLOW)
@ -1483,8 +1475,8 @@ vr_init_locked(struct vr_softc *sc)
/* Init circular RX list. */
if (vr_list_rx_init(sc) == ENOBUFS) {
printf(
"vr%d: initialization failed: no memory for rx buffers\n", sc->vr_unit);
if_printf(ifp,
"initialization failed: no memory for rx buffers\n");
vr_stop(sc);
return;
}
@ -1649,7 +1641,7 @@ vr_watchdog(struct ifnet *ifp)
VR_LOCK(sc);
ifp->if_oerrors++;
printf("vr%d: watchdog timeout\n", sc->vr_unit);
if_printf(ifp, "watchdog timeout\n");
vr_stop(sc);
vr_reset(sc);

View File

@ -460,7 +460,6 @@ struct vr_softc {
void *vr_intrhand;
device_t vr_miibus;
struct vr_type *vr_info; /* Rhine adapter info */
u_int8_t vr_unit; /* interface number */
u_int8_t vr_type;
u_int8_t vr_revid; /* Rhine chip revision */
u_int8_t vr_flags; /* See VR_F_* below */