sync with OpenBSD -current

This commit is contained in:
purplerain 2024-01-05 00:18:10 +00:00
parent eff43bb1fd
commit a2b5593ce1
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
76 changed files with 1704 additions and 1876 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: hidkbd.c,v 1.11 2023/11/30 12:50:41 miod Exp $ */
/* $OpenBSD: hidkbd.c,v 1.12 2024/01/03 21:41:44 tobhe Exp $ */
/* $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $ */
/*
@ -126,9 +126,9 @@ static const struct hidkbd_translation apple_tb_trans[] = {
static const struct hidkbd_translation apple_fn_trans[] = {
{ 40, 73 }, /* return -> insert */
{ 42, 76 }, /* backspace -> delete */
{ 58, 233 }, /* F1 -> screen brightness down */
{ 59, 232 }, /* F2 -> screen brightness up */
#ifdef notyet
{ 58, 0 }, /* F1 -> screen brightness down */
{ 59, 0 }, /* F2 -> screen brightness up */
{ 60, 0 }, /* F3 */
{ 61, 0 }, /* F4 */
{ 62, 0 }, /* F5 -> keyboard backlight down */
@ -138,8 +138,6 @@ static const struct hidkbd_translation apple_fn_trans[] = {
{ 66, 0 }, /* F9 -> audio next */
#endif
#ifdef __macppc__
{ 58, 233 }, /* F1 -> screen brightness down */
{ 59, 232 }, /* F2 -> screen brightness up */
{ 60, 127 }, /* F3 -> audio mute */
{ 61, 129 }, /* F4 -> audio lower */
{ 62, 128 }, /* F5 -> audio raise */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ufshci.c,v 1.3 2023/04/05 17:23:30 mglocker Exp $ */
/* $OpenBSD: ufshci.c,v 1.6 2024/01/04 21:35:56 mglocker Exp $ */
/*
* Copyright (c) 2022 Marcus Glocker <mglocker@openbsd.org>
@ -76,13 +76,14 @@ int ufshci_utr_cmd_capacity16(struct ufshci_softc *,
int ufshci_utr_cmd_capacity(struct ufshci_softc *,
struct ufshci_ccb *, int, int);
int ufshci_utr_cmd_read(struct ufshci_softc *,
struct ufshci_ccb *, int, int, uint32_t, uint16_t);
struct ufshci_ccb *, int, int,
struct scsi_generic *);
int ufshci_utr_cmd_write(struct ufshci_softc *,
struct ufshci_ccb *, int, int, uint32_t, uint16_t);
struct ufshci_ccb *, int, int,
struct scsi_generic *);
int ufshci_utr_cmd_sync(struct ufshci_softc *,
struct ufshci_ccb *, int, uint32_t, uint16_t);
int ufshci_xfer_complete(struct ufshci_softc *);
void ufshci_hexdump(void *, int, char *, int);
/* SCSI */
int ufshci_ccb_alloc(struct ufshci_softc *, int);
@ -105,12 +106,6 @@ void ufshci_scsi_io_done(struct ufshci_softc *,
void ufshci_scsi_done(struct ufshci_softc *,
struct ufshci_ccb *);
#if 0
const struct scsi_adapter ufshci_switch = {
ufshci_scsi_cmd, ufshci_minphys, ufshci_scsi_probe, ufshci_scsi_free,
NULL
};
#endif
const struct scsi_adapter ufshci_switch = {
ufshci_scsi_cmd, NULL, NULL, NULL, NULL
};
@ -1067,7 +1062,7 @@ ufshci_utr_cmd_capacity(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
int
ufshci_utr_cmd_read(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
int rsp_size, int flags, uint32_t lba, uint16_t blocks)
int rsp_size, int flags, struct scsi_generic *scsi_cmd)
{
int slot, off, len, i;
uint64_t dva;
@ -1112,14 +1107,8 @@ ufshci_utr_cmd_read(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
ucd->cmd.expected_xfer_len = htobe32(rsp_size);
ucd->cmd.cdb[0] = READ_10; /* 0x28 */
memcpy(ucd->cmd.cdb, scsi_cmd, sizeof(ucd->cmd.cdb));
//ucd->cmd.cdb[1] = (1 << 3); /* FUA: Force Unit Access */
ucd->cmd.cdb[2] = (lba >> 24) & 0xff;
ucd->cmd.cdb[3] = (lba >> 16) & 0xff;
ucd->cmd.cdb[4] = (lba >> 8) & 0xff;
ucd->cmd.cdb[5] = (lba >> 0) & 0xff;
ucd->cmd.cdb[7] = (blocks >> 8) & 0xff;
ucd->cmd.cdb[8] = (blocks >> 0) & 0xff;
/* 7.2.1 Basic Steps when Building a UTP Transfer Request: 2g) */
/* Already done with above memset */
@ -1181,7 +1170,7 @@ ufshci_utr_cmd_read(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
int
ufshci_utr_cmd_write(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
int rsp_size, int flags, uint32_t lba, uint16_t blocks)
int rsp_size, int flags, struct scsi_generic *scsi_cmd)
{
int slot, off, len, i;
uint64_t dva;
@ -1226,14 +1215,8 @@ ufshci_utr_cmd_write(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
ucd->cmd.expected_xfer_len = htobe32(rsp_size);
ucd->cmd.cdb[0] = WRITE_10; /* 0x2a */
memcpy(ucd->cmd.cdb, scsi_cmd, sizeof(ucd->cmd.cdb));
ucd->cmd.cdb[1] = (1 << 3); /* FUA: Force Unit Access */
ucd->cmd.cdb[2] = (lba >> 24) & 0xff;
ucd->cmd.cdb[3] = (lba >> 16) & 0xff;
ucd->cmd.cdb[4] = (lba >> 8) & 0xff;
ucd->cmd.cdb[5] = (lba >> 0) & 0xff;
ucd->cmd.cdb[7] = (blocks >> 8) & 0xff;
ucd->cmd.cdb[8] = (blocks >> 0) & 0xff;
/* 7.2.1 Basic Steps when Building a UTP Transfer Request: 2g) */
/* Already done with above memset */
@ -1284,7 +1267,7 @@ ufshci_utr_cmd_write(struct ufshci_softc *sc, struct ufshci_ccb *ccb,
UFSHCI_REG_UTRIACR_IAEN |
UFSHCI_REG_UTRIACR_IAPWEN |
UFSHCI_REG_UTRIACR_IACTH(UFSHCI_INTR_AGGR_COUNT) |
UFSHCI_REG_UTRIACR_IATOVAL(UFSHCI_INTR_AGGR_COUNT));
UFSHCI_REG_UTRIACR_IATOVAL(UFSHCI_INTR_AGGR_TIMEOUT));
}
/* 7.2.1 Basic Steps when Building a UTP Transfer Request: 14) */
@ -1425,51 +1408,6 @@ ufshci_xfer_complete(struct ufshci_softc *sc)
return 0;
}
#ifdef UFSHCI_DEBUG
void
ufshci_hexdump(void *buf, int len, char *title, int dbglvl)
{
u_char b[16];
int i, j, l;
if (dbglvl > ufshci_dbglvl)
return;
printf("hexdump for %s (size=%d bytes)\n", title, len);
for (i = 0; i < len; i += l) {
printf("%4i:", i);
l = min(sizeof(b), len - i);
bcopy(buf + i, b, l);
for (j = 0; j < sizeof(b); j++) {
if (j % 2 == 0)
printf(" ");
if (j % 8 == 0)
printf(" ");
if (j < l)
printf("%02x", (int)b[j]);
else
printf(" ");
}
printf(" |");
for (j = 0; j < l; j++) {
if (b[j] >= 0x20 && b[j] <= 0x7e)
printf("%c", b[j]);
else
printf(".");
}
printf("|\n");
}
}
#else
void
ufshci_hexdump(void *buf, int len, char *title, int dbglvl)
{
}
#endif
/* SCSI */
int
@ -1859,15 +1797,11 @@ ufshci_scsi_io(struct scsi_xfer *xs, int dir)
struct ufshci_softc *sc = link->bus->sb_adapter_softc;
struct ufshci_ccb *ccb = xs->io;
bus_dmamap_t dmap = ccb->ccb_dmamap;
uint64_t lba;
uint32_t blocks;
int error;
if ((xs->flags & (SCSI_DATA_IN | SCSI_DATA_OUT)) != dir)
goto error1;
scsi_cmd_rw_decode(&xs->cmd, &lba, &blocks);
DPRINTF("%s: %s, lba=%llu, blocks=%u, datalen=%d (%s)\n",
__func__,
ISSET(xs->flags, SCSI_DATA_IN) ? "READ" : "WRITE",
@ -1890,10 +1824,10 @@ ufshci_scsi_io(struct scsi_xfer *xs, int dir)
if (dir == SCSI_DATA_IN) {
ccb->ccb_slot = ufshci_utr_cmd_read(sc, ccb, xs->datalen,
xs->flags, (uint32_t)lba, (uint16_t)blocks);
xs->flags, &xs->cmd);
} else {
ccb->ccb_slot = ufshci_utr_cmd_write(sc, ccb, xs->datalen,
xs->flags, (uint32_t)lba, (uint16_t)blocks);
xs->flags, &xs->cmd);
}
if (ccb->ccb_slot == -1)
@ -1924,33 +1858,11 @@ ufshci_scsi_io_done(struct ufshci_softc *sc, struct ufshci_ccb *ccb)
{
struct scsi_xfer *xs = ccb->ccb_cookie;
bus_dmamap_t dmap = ccb->ccb_dmamap;
#if 0
struct ufshci_utrd *utrd;
struct ufshci_ucd *ucd;
int slot = ccb->ccb_slot;
#endif
bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
ISSET(xs->flags, SCSI_DATA_IN) ? BUS_DMASYNC_POSTREAD :
BUS_DMASYNC_POSTWRITE);
#if 0
ufshci_hexdump(xs->data, xs->datalen, "xs->data", 1);
utrd = UFSHCI_DMA_KVA(sc->sc_dmamem_utrd) + (sizeof(*utrd) * slot);
ucd = UFSHCI_DMA_KVA(sc->sc_dmamem_ucd) + (sizeof(*ucd) * slot);
printf("ucd rsp tc=0x%02x\n", ucd->rsp.hdr.tc);
printf("ucd rsp flags=0x%02x\n", ucd->rsp.hdr.flags);
printf("ucd rsp lun=%d\n", ucd->rsp.hdr.lun);
printf("ucd rsp taskid=%d\n", ucd->rsp.hdr.taskid);
printf("ucd rsp cmd_set_type=0x%02x\n", ucd->rsp.hdr.cmd_set_type);
printf("ucd rsp query=0x%02x\n", ucd->rsp.hdr.query);
printf("ucd rsp response=0x%02x\n", ucd->rsp.hdr.response);
printf("ucd rsp status=0x%02x\n", ucd->rsp.hdr.status);
printf("ucd rsp ehs_len=%d\n", ucd->rsp.hdr.ehs_len);
printf("ucd rsp device_info=0x%02x\n", ucd->rsp.hdr.device_info);
printf("ucd rsp ds_len=%d\n", ucd->rsp.hdr.ds_len);
printf("ucd rsp rxl=%d\n", be32toh(ucd->rsp.residual_xfer_len));
#endif
bus_dmamap_unload(sc->sc_dmat, dmap);
ccb->ccb_cookie = NULL;
@ -1967,29 +1879,7 @@ void
ufshci_scsi_done(struct ufshci_softc *sc, struct ufshci_ccb *ccb)
{
struct scsi_xfer *xs = ccb->ccb_cookie;
#if 0
struct ufshci_utrd *utrd;
struct ufshci_ucd *ucd;
int slot = ccb->ccb_slot;
ufshci_hexdump(xs->data, xs->datalen, "xs->data", 1);
utrd = UFSHCI_DMA_KVA(sc->sc_dmamem_utrd) + (sizeof(*utrd) * slot);
ucd = UFSHCI_DMA_KVA(sc->sc_dmamem_ucd) + (sizeof(*ucd) * slot);
printf("ucd rsp tc=0x%02x\n", ucd->rsp.hdr.tc);
printf("ucd rsp flags=0x%02x\n", ucd->rsp.hdr.flags);
printf("ucd rsp lun=%d\n", ucd->rsp.hdr.lun);
printf("ucd rsp taskid=%d\n", ucd->rsp.hdr.taskid);
printf("ucd rsp cmd_set_type=0x%02x\n", ucd->rsp.hdr.cmd_set_type);
printf("ucd rsp query=0x%02x\n", ucd->rsp.hdr.query);
printf("ucd rsp response=0x%02x\n", ucd->rsp.hdr.response);
printf("ucd rsp status=0x%02x\n", ucd->rsp.hdr.status);
printf("ucd rsp ehs_len=%d\n", ucd->rsp.hdr.ehs_len);
printf("ucd rsp device_info=0x%02x\n", ucd->rsp.hdr.device_info);
printf("ucd rsp ds_len=%d\n", ucd->rsp.hdr.ds_len);
printf("ucd rsp rxl=%d\n", be32toh(ucd->rsp.residual_xfer_len));
#endif
ccb->ccb_cookie = NULL;
ccb->ccb_slot = -1;
ccb->ccb_done = NULL;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ufshcireg.h,v 1.3 2023/08/15 08:27:30 miod Exp $ */
/* $OpenBSD: ufshcireg.h,v 1.4 2024/01/04 21:02:30 mglocker Exp $ */
/*
* Copyright (c) 2022 Marcus Glocker <mglocker@openbsd.org>
@ -21,7 +21,7 @@
*/
#define UFSHCI_UCD_PRDT_MAX_SEGS 64
#define UFSHCI_UCD_PRDT_MAX_XFER (UFSHCI_UCD_PRDT_MAX_SEGS * PAGE_SIZE)
#define UFSHCI_INTR_AGGR_COUNT 6
#define UFSHCI_INTR_AGGR_COUNT 1 /* Max. allowed value = 31 */
#define UFSHCI_INTR_AGGR_TIMEOUT 0x64 /* 4ms */
#define UFSHCI_MAX_UNITS 32

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_bnxt.c,v 1.39 2023/11/10 15:51:20 bluhm Exp $ */
/* $OpenBSD: if_bnxt.c,v 1.40 2024/01/04 07:08:47 jmatthew Exp $ */
/*-
* Broadcom NetXtreme-C/E network driver.
*
@ -1158,12 +1158,16 @@ bnxt_down(struct bnxt_softc *sc)
CLR(ifp->if_flags, IFF_RUNNING);
intr_barrier(sc->sc_ih);
for (i = 0; i < sc->sc_nqueues; i++) {
ifq_clr_oactive(ifp->if_ifqs[i]);
ifq_barrier(ifp->if_ifqs[i]);
/* intr barrier? */
timeout_del(&sc->sc_queues[i].q_rx.rx_refill);
timeout_del_barrier(&sc->sc_queues[i].q_rx.rx_refill);
if (sc->sc_intrmap != NULL)
intr_barrier(sc->sc_queues[i].q_ihc);
}
bnxt_hwrm_free_filter(sc, &sc->sc_vnic);

View file

@ -846,7 +846,7 @@ kvp_get_ip_info(struct hv_kvp *kvp, const uint8_t *mac, uint8_t *family,
struct sockaddr_in6 *sin6, sa6;
uint8_t enaddr[ETHER_ADDR_LEN];
uint8_t ipaddr[INET6_ADDRSTRLEN];
int i, j, lo, hi, af;
int i, j, lo, hi, s, af;
/* Convert from the UTF-16LE string format to binary */
for (i = 0, j = 0; j < ETHER_ADDR_LEN; i += 6) {
@ -870,14 +870,16 @@ kvp_get_ip_info(struct hv_kvp *kvp, const uint8_t *mac, uint8_t *family,
return (-1);
}
NET_LOCK_SHARED();
KERNEL_LOCK();
s = splnet();
TAILQ_FOREACH(ifp, &ifnetlist, if_list) {
if (!memcmp(LLADDR(ifp->if_sadl), enaddr, ETHER_ADDR_LEN))
break;
}
if (ifp == NULL) {
NET_UNLOCK_SHARED();
splx(s);
KERNEL_UNLOCK();
return (-1);
}
@ -917,7 +919,8 @@ kvp_get_ip_info(struct hv_kvp *kvp, const uint8_t *mac, uint8_t *family,
else if (ifa6ll != NULL)
ifa = ifa6ll;
else {
NET_UNLOCK_SHARED();
splx(s);
KERNEL_UNLOCK();
return (-1);
}
}
@ -953,7 +956,8 @@ kvp_get_ip_info(struct hv_kvp *kvp, const uint8_t *mac, uint8_t *family,
break;
}
NET_UNLOCK_SHARED();
splx(s);
KERNEL_UNLOCK();
return (0);
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_axen.c,v 1.31 2022/01/09 05:43:00 jsg Exp $ */
/* $OpenBSD: if_axen.c,v 1.32 2024/01/04 08:41:59 kevlo Exp $ */
/*
* Copyright (c) 2013 Yojiro UO <yuo@openbsd.org>
@ -17,8 +17,8 @@
*/
/*
* ASIX Electronics AX88178a USB 2.0 ethernet and AX88179 USB 3.0 Ethernet
* driver.
* ASIX Electronics AX88178a USB 2.0 ethernet and
* AX88179/AX88179a USB 3.0 Ethernet driver.
*/
#include "bpfilter.h"
@ -600,6 +600,7 @@ axen_attach(struct device *parent, struct device *self, void *aux)
struct usb_attach_arg *uaa = aux;
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
usb_device_descriptor_t *dd;
struct mii_data *mii;
u_char eaddr[ETHER_ADDR_LEN];
char *devname = sc->axen_dev.dv_xname;
@ -658,6 +659,10 @@ axen_attach(struct device *parent, struct device *self, void *aux)
}
}
dd = usbd_get_device_descriptor(sc->axen_udev);
if (UGETW(dd->bcdDevice) == 0x200)
sc->axen_flags = AX179A;
s = splnet();
sc->axen_phyno = AXEN_PHY_ID;
@ -680,6 +685,8 @@ axen_attach(struct device *parent, struct device *self, void *aux)
printf(" AX88178a");
else if (sc->axen_flags & AX179)
printf(" AX88179");
else
printf(" AX88179A");
printf(", address %s\n", ether_sprintf(eaddr));
bcopy(eaddr, (char *)&sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
@ -885,7 +892,7 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
u_int16_t hdr_offset, pkt_count;
size_t pkt_len;
size_t temp;
int s;
int padlen, s;
DPRINTFN(10,("%s: %s: enter\n", sc->axen_dev.dv_xname,__func__));
@ -916,7 +923,14 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
/*
* buffer map
*
* for ax88179
* [packet #0]...[packet #n][pkt hdr#0]..[pkt hdr#n][recv_hdr]
*
* for ax88179a
* [packet #0]...[packet #n][pkt hdr#0][dummy_hdr]..
* [pkt hdr#n][dummy_hdr][recv_hdr]
*
* each packet has 0xeeee as pseudo header..
*/
hdr_p = (u_int32_t *)(buf + total_len - sizeof(u_int32_t));
@ -953,7 +967,23 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
}
#endif
/* skip pseudo header (2byte) */
padlen = 2;
/* skip trailer padding (4Byte) for ax88179 */
if (!(sc->axen_flags & AX179A))
padlen += 4;
do {
pkt_hdr = letoh32(*hdr_p);
pkt_len = (pkt_hdr >> 16) & 0x1fff;
DPRINTFN(10,("rxeof: packet#%d, pkt_hdr 0x%08x, pkt_len %zu\n",
pkt_count, pkt_hdr, pkt_len));
/* skip dummy packet header */
if (pkt_len == 0)
goto nextpkt;
if ((buf[0] != 0xee) || (buf[1] != 0xee)){
printf("%s: invalid buffer(pkt#%d), continue\n",
sc->axen_dev.dv_xname, pkt_count);
@ -961,12 +991,6 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
goto done;
}
pkt_hdr = letoh32(*hdr_p);
pkt_len = (pkt_hdr >> 16) & 0x1fff;
DPRINTFN(10,("rxeof: packet#%d, pkt_hdr 0x%08x, pkt_len %zu\n",
pkt_count, pkt_hdr, pkt_len));
if ((pkt_hdr & AXEN_RXHDR_CRC_ERR) ||
(pkt_hdr & AXEN_RXHDR_DROP_ERR)) {
ifp->if_ierrors++;
@ -983,8 +1007,7 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
goto nextpkt;
}
/* skip pseudo header (2byte) and trailer padding (4Byte) */
m->m_pkthdr.len = m->m_len = pkt_len - 6;
m->m_pkthdr.len = m->m_len = pkt_len - padlen;
#ifdef AXEN_TOE
/* checksum err */
@ -1007,7 +1030,7 @@ axen_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
M_UDP_CSUM_IN_OK;
#endif
memcpy(mtod(m, char *), buf + 2, pkt_len - 6);
memcpy(mtod(m, char *), buf + 2, pkt_len - padlen);
ml_enqueue(&ml, m);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_axenreg.h,v 1.6 2016/09/14 12:41:09 mpi Exp $ */
/* $OpenBSD: if_axenreg.h,v 1.7 2024/01/04 08:41:59 kevlo Exp $ */
/*
* Copyright (c) 2013 Yojiro UO <yuo@openbsd.org>. All right reserved.
@ -227,6 +227,7 @@ struct axen_type {
u_int16_t axen_flags;
#define AX178A 0x0001 /* AX88178a */
#define AX179 0x0002 /* AX88179 */
#define AX179A 0x0004 /* AX88179a */
};
struct axen_softc;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_cdce.c,v 1.81 2023/04/27 08:33:59 gerhard Exp $ */
/* $OpenBSD: if_cdce.c,v 1.82 2024/01/04 08:41:59 kevlo Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
@ -59,11 +59,8 @@
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <machine/bus.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdivar.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbdevs.h>
#include <dev/usb/usbcdc.h>
@ -93,19 +90,18 @@ void cdce_stop(struct cdce_softc *);
void cdce_intr(struct usbd_xfer *, void *, usbd_status);
const struct cdce_type cdce_devs[] = {
{{ USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632 }, 0, 0, -1 },
{{ USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2501 }, 0, 0, -1 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5500 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_A300 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5600 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C700 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C750 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN2 }, 0, CDCE_CRC32, -1 },
{{ USB_VENDOR_GMATE, USB_PRODUCT_GMATE_YP3X00 }, 0, 0, -1 },
{{ USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX }, 0, 0, -1 },
{{ USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250 }, 0, CDCE_SWAPUNION, -1 },
{{ USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88179 }, 0x0200, CDCE_MATCHREV, 3 },
{{ USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632 }, 0 },
{{ USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2501 }, 0 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5500 }, CDCE_CRC32 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_A300 }, CDCE_CRC32 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SL5600 }, CDCE_CRC32 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C700 }, CDCE_CRC32 },
{{ USB_VENDOR_SHARP, USB_PRODUCT_SHARP_C750 }, CDCE_CRC32 },
{{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN }, CDCE_CRC32 },
{{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_USBLAN2 }, CDCE_CRC32 },
{{ USB_VENDOR_GMATE, USB_PRODUCT_GMATE_YP3X00 }, 0 },
{{ USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX }, 0 },
{{ USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250 }, CDCE_SWAPUNION },
};
#define cdce_lookup(v, p) \
((const struct cdce_type *)usb_lookup(cdce_devs, v, p))
@ -127,15 +123,6 @@ cdce_match(struct device *parent, void *match, void *aux)
{
struct usb_attach_arg *uaa = aux;
usb_interface_descriptor_t *id;
const struct cdce_type *type;
if ((type = cdce_lookup(uaa->vendor, uaa->product)) != NULL) {
if (type->cdce_flags & CDCE_MATCHREV) {
if (type->cdce_rev == uaa->release)
return (UMATCH_VENDOR_PRODUCT_REV);
} else
return (UMATCH_VENDOR_PRODUCT);
}
if (uaa->iface == NULL)
return (UMATCH_NONE);
@ -144,6 +131,9 @@ cdce_match(struct device *parent, void *match, void *aux)
if (id == NULL)
return (UMATCH_NONE);
if (cdce_lookup(uaa->vendor, uaa->product) != NULL)
return (UMATCH_VENDOR_PRODUCT);
if (id->bInterfaceClass == UICLASS_CDC &&
(id->bInterfaceSubClass ==
UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL ||
@ -160,6 +150,7 @@ cdce_attach(struct device *parent, struct device *self, void *aux)
struct usb_attach_arg *uaa = aux;
int s;
struct ifnet *ifp = GET_IFP(sc);
struct usbd_device *dev = uaa->device;
const struct cdce_type *t;
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
@ -172,51 +163,19 @@ cdce_attach(struct device *parent, struct device *self, void *aux)
int i, j, numalts, len;
int ctl_ifcno = -1;
int data_ifcno = -1;
usbd_status err;
t = cdce_lookup(uaa->vendor, uaa->product);
if (uaa->configno < 0) {
if (t == NULL || t->cdce_cfgno < 0) {
printf("%s: unknown configuration for vid/pid match\n",
sc->cdce_dev.dv_xname);
return;
}
uaa->configno = t->cdce_cfgno;
DPRINTF(("%s: switching to config #%d\n",
sc->cdce_dev.dv_xname));
err = usbd_set_config_no(uaa->device, uaa->configno, 1);
if (err) {
printf("%s: failed to switch to config #%d: %s\n",
sc->cdce_dev.dv_xname, uaa->configno,
usbd_errstr(err));
return;
}
for (i = 0; i < uaa->device->cdesc->bNumInterfaces; i++) {
if (usbd_iface_claimed(uaa->device, i))
continue;
id = usbd_get_interface_descriptor(
&uaa->device->ifaces[i]);
if (id != NULL && id->bInterfaceClass == UICLASS_CDC &&
id->bInterfaceSubClass ==
UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL) {
uaa->iface = &uaa->device->ifaces[i];
uaa->ifaceno = uaa->iface->idesc->bInterfaceNumber;
break;
}
}
}
sc->cdce_udev = uaa->device;
sc->cdce_ctl_iface = uaa->iface;
id = usbd_get_interface_descriptor(sc->cdce_ctl_iface);
ctl_ifcno = id->bInterfaceNumber;
t = cdce_lookup(uaa->vendor, uaa->product);
if (t)
sc->cdce_flags = t->cdce_flags;
/* Get the data interface no. and capabilities */
ethd = NULL;
usbd_desc_iter_init(sc->cdce_udev, &iter);
usbd_desc_iter_init(dev, &iter);
desc = usbd_desc_iter_next(&iter);
while (desc) {
if (desc->bDescriptorType != UDESC_CS_INTERFACE) {
@ -251,13 +210,12 @@ cdce_attach(struct device *parent, struct device *self, void *aux)
} else {
DPRINTF(("cdce_attach: union interface: ctl=%d, data=%d\n",
ctl_ifcno, data_ifcno));
for (i = 0; i < uaa->device->cdesc->bNumInterfaces; i++) {
for (i = 0; i < uaa->nifaces; i++) {
if (usbd_iface_claimed(sc->cdce_udev, i))
continue;
id = usbd_get_interface_descriptor(
&uaa->device->ifaces[i]);
id = usbd_get_interface_descriptor(uaa->ifaces[i]);
if (id != NULL && id->bInterfaceNumber == data_ifcno) {
sc->cdce_data_iface = &uaa->device->ifaces[i];
sc->cdce_data_iface = uaa->ifaces[i];
usbd_claim_iface(sc->cdce_udev, i);
}
}
@ -345,8 +303,8 @@ cdce_attach(struct device *parent, struct device *self, void *aux)
found:
s = splnet();
if (!ethd || usbd_get_string_desc(sc->cdce_udev, ethd->iMacAddress,
sc->cdce_udev->langid, &eaddr_str, &len)) {
if (!ethd || usbd_get_string_desc(sc->cdce_udev, ethd->iMacAddress, 0,
&eaddr_str, &len)) {
ether_fakeaddr(ifp);
} else {
for (i = 0; i < ETHER_ADDR_LEN * 2; i++) {

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_cdcereg.h,v 1.8 2023/04/27 08:33:59 gerhard Exp $ */
/* $OpenBSD: if_cdcereg.h,v 1.9 2024/01/04 08:41:59 kevlo Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
@ -40,12 +40,9 @@
struct cdce_type {
struct usb_devno cdce_dev;
u_int16_t cdce_rev;
u_int16_t cdce_flags;
#define CDCE_CRC32 1
#define CDCE_SWAPUNION 2
#define CDCE_MATCHREV 4
int cdce_cfgno;
};
struct cdce_softc;