NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

re: kern/54486: athn driver panics on arm



The following reply was made to PR kern/54486; it has been noted by GNATS.

From: matthew green <mrg%eterna.com.au@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
    netbsd-bugs%netbsd.org@localhost, gson%gson.org@localhost (Andreas Gustafsson)
Subject: re: kern/54486: athn driver panics on arm
Date: Sat, 24 Aug 2019 10:21:19 +1000

 could you try this patch?
 
 
 .mrg.
 
 
 Index: if_athn_usb.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/usb/if_athn_usb.c,v
 retrieving revision 1.34
 diff -p -u -r1.34 if_athn_usb.c
 --- if_athn_usb.c	3 Jun 2019 09:58:31 -0000	1.34
 +++ if_athn_usb.c	24 Aug 2019 00:20:44 -0000
 @@ -2450,8 +2450,8 @@ athn_usb_tx(struct athn_softc *sc, struc
  	struct ieee80211_key *k = NULL;
  	struct ar_stream_hdr *hdr;
  	struct ar_htc_frame_hdr *htc;
 -	struct ar_tx_frame *txf;
  	struct ar_tx_mgmt *txm;
 +	uint8_t *next;
  	uint8_t *frm;
  	uint8_t sta_index, qid, tid;
  	int error, s, xferlen;
 @@ -2497,30 +2497,35 @@ athn_usb_tx(struct athn_softc *sc, struc
  
  	/* NB: We don't take advantage of USB Tx stream mode for now. */
  	hdr = (struct ar_stream_hdr *)data->buf;
 +	next = data->buf + sizeof(*hdr);
  	hdr->tag = htole16(AR_USB_TX_STREAM_TAG);
  
 -	htc = (struct ar_htc_frame_hdr *)&hdr[1];
 +	htc = (struct ar_htc_frame_hdr *)next;
 +	next = next + sizeof(*htc);
  	memset(htc, 0, sizeof(*htc));
  	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
  	    IEEE80211_FC0_TYPE_DATA) {
  		htc->endpoint_id = usc->usc_ep_data[qid];
 +		struct ar_tx_frame txf = {0};
 +		struct ar_tx_frame *txfp;
  
 -		txf = (struct ar_tx_frame *)&htc[1];
 -		memset(txf, 0, sizeof(*txf));
 -		txf->data_type = AR_HTC_NORMAL;
 -		txf->node_idx = sta_index;
 -		txf->vif_idx = 0;
 -		txf->tid = tid;
 +		txf.data_type = AR_HTC_NORMAL;
 +		txf.node_idx = sta_index;
 +		txf.vif_idx = 0;
 +		txf.tid = tid;
  		if (m->m_pkthdr.len + IEEE80211_CRC_LEN > ic->ic_rtsthreshold)
 -			txf->flags |= htobe32(AR_HTC_TX_RTSCTS);
 +			txf.flags |= htobe32(AR_HTC_TX_RTSCTS);
  		else if (ic->ic_flags & IEEE80211_F_USEPROT) {
  			if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
 -				txf->flags |= htobe32(AR_HTC_TX_CTSONLY);
 +				txf.flags |= htobe32(AR_HTC_TX_CTSONLY);
  			else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
 -				txf->flags |= htobe32(AR_HTC_TX_RTSCTS);
 +				txf.flags |= htobe32(AR_HTC_TX_RTSCTS);
  		}
 -		txf->key_idx = 0xff;
 -		frm = (uint8_t *)&txf[1];
 +		txf.key_idx = 0xff;
 +		txfp = (struct ar_tx_frame *)next;
 +		next = next + sizeof *txfp;
 +		memcpy(txfp, &txf, sizeof txf);
 +		frm = next;
  	} else {
  		htc->endpoint_id = usc->usc_ep_mgmt;
  
 


Home | Main Index | Thread Index | Old Index