View | Details | Raw Unified | Return to bug 252608 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/dev/usb/net/if_ure.c (-45 / +4 lines)
Lines 581-593 ure_attach(device_t dev) Link Here
581
		goto detach;
581
		goto detach;
582
	}
582
	}
583
583
584
	/* Mark all TX transfers as available */
585
	for (int i = 0; i < URE_N_TRANSFER; i++) {
586
		sc->sc_txavail[i] = sc->sc_tx_xfer[i];
587
		DEVPRINTF(dev, "sc_txavail[%d] = %p\n", i, sc->sc_txavail[i]);
588
	}
589
	sc->sc_txpos = 0;
590
591
	ue->ue_sc = sc;
584
	ue->ue_sc = sc;
592
	ue->ue_dev = dev;
585
	ue->ue_dev = dev;
593
	ue->ue_udev = uaa->device;
586
	ue->ue_udev = uaa->device;
Lines 870-885 ure_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) Link Here
870
863
871
		usbd_transfer_submit(xfer);
864
		usbd_transfer_submit(xfer);
872
865
873
		KASSERT(sc->sc_txpos >= 0 && sc->sc_txpos <= URE_N_TRANSFER,
874
		    ("sc_txpos invalid: %d", sc->sc_txpos));
875
		if (sc->sc_txpos < URE_N_TRANSFER &&
876
		    !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
877
			xfer = sc->sc_txavail[sc->sc_txpos++];
878
			usbd_transfer_start(xfer);
879
		}
880
881
		if (sc->sc_txpos == URE_N_TRANSFER)
882
			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
883
		return;
866
		return;
884
867
885
	default:			/* Error */
868
	default:			/* Error */
Lines 900-910 ure_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) Link Here
900
			goto tr_setup;
883
			goto tr_setup;
901
		}
884
		}
902
	}
885
	}
903
904
	KASSERT(sc->sc_txpos > 0 && sc->sc_txpos <= URE_N_TRANSFER, ("sc_txpos invalid: %d", sc->sc_txpos));
905
	sc->sc_txavail[(--(sc->sc_txpos))] = xfer;
906
	if (sc->sc_txpos < URE_N_TRANSFER)
907
		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
908
}
886
}
909
887
910
static void
888
static void
Lines 1110-1119 ure_tick(struct usb_ether *ue) Link Here
1110
1088
1111
	URE_LOCK_ASSERT(sc, MA_OWNED);
1089
	URE_LOCK_ASSERT(sc, MA_OWNED);
1112
1090
1113
	KASSERT(sc->sc_txpos >= 0 && sc->sc_txpos <= URE_N_TRANSFER, ("sc_txpos invalid: %d", sc->sc_txpos));
1114
	(void)ifp;
1091
	(void)ifp;
1115
	DEVPRINTFN(13, sc->sc_ue.ue_dev,
1116
	    "sc_txpos: %d, oactive: %d\n", sc->sc_txpos, !!(ifp->if_drv_flags & IFF_DRV_OACTIVE));
1117
	for (int i = 0; i < URE_N_TRANSFER; i++)
1092
	for (int i = 0; i < URE_N_TRANSFER; i++)
1118
		DEVPRINTFN(13, sc->sc_ue.ue_dev,
1093
		DEVPRINTFN(13, sc->sc_ue.ue_dev,
1119
		    "rx[%d] = %d\n", i, USB_GET_STATE(sc->sc_rx_xfer[i]));
1094
		    "rx[%d] = %d\n", i, USB_GET_STATE(sc->sc_rx_xfer[i]));
Lines 1190-1223 static void Link Here
1190
ure_start(struct usb_ether *ue)
1165
ure_start(struct usb_ether *ue)
1191
{
1166
{
1192
	struct ure_softc *sc = uether_getsc(ue);
1167
	struct ure_softc *sc = uether_getsc(ue);
1193
	struct usb_xfer *xfer;
1168
	unsigned i;
1194
	struct ifnet *ifp;
1195
1169
1196
	URE_LOCK_ASSERT(sc, MA_OWNED);
1170
	URE_LOCK_ASSERT(sc, MA_OWNED);
1197
1171
1198
	if (!sc->sc_rxstarted) {
1172
	if (!sc->sc_rxstarted) {
1199
		sc->sc_rxstarted = 1;
1173
		sc->sc_rxstarted = 1;
1200
		for (int i = 0; i < URE_N_TRANSFER; i++)
1174
		for (i = 0; i < URE_N_TRANSFER; i++)
1201
			usbd_transfer_start(sc->sc_rx_xfer[i]);
1175
			usbd_transfer_start(sc->sc_rx_xfer[i]);
1202
	}
1176
	}
1203
1177
1204
	/*
1178
	for (i = 0; i < URE_N_TRANSFER; i++)
1205
	 * start the USB transfers, if not already started:
1179
		usbd_transfer_start(sc->sc_tx_xfer[i]);
1206
	 */
1207
	if (sc->sc_txpos == URE_N_TRANSFER) {
1208
		ifp = uether_getifp(&sc->sc_ue);
1209
1210
		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1211
		return;
1212
	}
1213
1214
	KASSERT(sc->sc_txpos >= 0 && sc->sc_txpos < URE_N_TRANSFER, ("sc_txpos invalid: %d", sc->sc_txpos));
1215
	xfer = sc->sc_txavail[sc->sc_txpos++];
1216
	if (sc->sc_txpos == URE_N_TRANSFER) {
1217
		ifp = uether_getifp(&sc->sc_ue);
1218
		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1219
	}
1220
	usbd_transfer_start(xfer);
1221
}
1180
}
1222
1181
1223
static void
1182
static void
(-)b/sys/dev/usb/net/if_urereg.h (-9 lines)
Lines 445-459 struct ure_softc { Link Here
445
445
446
	int			sc_rxstarted;
446
	int			sc_rxstarted;
447
447
448
	struct usb_xfer		*sc_txavail[URE_N_TRANSFER];
449
	/*
450
	 * Position of next available xfer for TX.  If
451
	 * sc_txpos == URE_N_TRANSFER, no tx xfer's are available.
452
	 * Pop xfer:  sc->sc_txavail[sc->sc_txpos++]
453
	 * Push xfer: sc->sc_txavail[(--(sc->sc_txpos))] = xfer
454
	 */
455
	int			sc_txpos;
456
457
	int			sc_phyno;
448
	int			sc_phyno;
458
449
459
	u_int			sc_flags;
450
	u_int			sc_flags;

Return to bug 252608