svn commit: r311845 - head/sys/dev/rtwn/pci
Andriy Voskoboinyk
avos at FreeBSD.org
Tue Jan 10 01:09:40 UTC 2017
Author: avos
Date: Tue Jan 10 01:09:39 2017
New Revision: 311845
URL: https://svnweb.freebsd.org/changeset/base/311845
Log:
rtwn_pci(4): fix possible race while accessing 'matched_chip' variable.
Modified:
head/sys/dev/rtwn/pci/rtwn_pci_attach.c
Modified: head/sys/dev/rtwn/pci/rtwn_pci_attach.c
==============================================================================
--- head/sys/dev/rtwn/pci/rtwn_pci_attach.c Tue Jan 10 00:28:01 2017 (r311844)
+++ head/sys/dev/rtwn/pci/rtwn_pci_attach.c Tue Jan 10 01:09:39 2017 (r311845)
@@ -94,20 +94,31 @@ static void rtwn_pci_beacon_update_end(s
static void rtwn_pci_attach_methods(struct rtwn_softc *);
-static int matched_chip = RTWN_CHIP_MAX_PCI;
+static const struct rtwn_pci_ident *
+rtwn_pci_probe_sub(device_t dev)
+{
+ const struct rtwn_pci_ident *ident;
+ int vendor_id, device_id;
+
+ vendor_id = pci_get_vendor(dev);
+ device_id = pci_get_device(dev);
+
+ for (ident = rtwn_pci_ident_table; ident->name != NULL; ident++)
+ if (vendor_id == ident->vendor && device_id == ident->device)
+ return (ident);
+
+ return (NULL);
+}
static int
rtwn_pci_probe(device_t dev)
{
const struct rtwn_pci_ident *ident;
- for (ident = rtwn_pci_ident_table; ident->name != NULL; ident++) {
- if (pci_get_vendor(dev) == ident->vendor &&
- pci_get_device(dev) == ident->device) {
- matched_chip = ident->chip;
- device_set_desc(dev, ident->name);
- return (BUS_PROBE_DEFAULT);
- }
+ ident = rtwn_pci_probe_sub(dev);
+ if (ident != NULL) {
+ device_set_desc(dev, ident->name);
+ return (BUS_PROBE_DEFAULT);
}
return (ENXIO);
}
@@ -591,13 +602,15 @@ rtwn_pci_attach_methods(struct rtwn_soft
static int
rtwn_pci_attach(device_t dev)
{
+ const struct rtwn_pci_ident *ident;
struct rtwn_pci_softc *pc = device_get_softc(dev);
struct rtwn_softc *sc = &pc->pc_sc;
struct ieee80211com *ic = &sc->sc_ic;
uint32_t lcsr;
int cap_off, i, error, rid;
- if (matched_chip >= RTWN_CHIP_MAX_PCI)
+ ident = rtwn_pci_probe_sub(dev);
+ if (ident == NULL)
return (ENXIO);
/*
@@ -649,8 +662,7 @@ rtwn_pci_attach(device_t dev)
mtx_init(&sc->sc_mtx, ic->ic_name, MTX_NETWORK_LOCK, MTX_DEF);
rtwn_pci_attach_methods(sc);
- /* XXX something similar to USB_GET_DRIVER_INFO() */
- rtwn_pci_attach_private(pc, matched_chip);
+ rtwn_pci_attach_private(pc, ident->chip);
/* Allocate Tx/Rx buffers. */
error = rtwn_pci_alloc_rx_list(sc);
More information about the svn-src-head
mailing list