Deleted Added
full compact
if_bwn.c (331722) if_bwn.c (342138)
1/*-
2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
28 */
29
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: stable/11/sys/dev/bwn/if_bwn.c 331722 2018-03-29 02:50:57Z eadler $");
31__FBSDID("$FreeBSD: stable/11/sys/dev/bwn/if_bwn.c 342138 2018-12-15 20:07:32Z markj $");
32
33/*
34 * The Broadcom Wireless LAN controller driver.
35 */
36
37#include "opt_bwn.h"
38#include "opt_wlan.h"
39

--- 151 unchanged lines hidden (view full) ---

191 const struct bwn_txstatus *);
192static uint16_t bwn_pio_rx_read_2(struct bwn_pio_rxqueue *, uint16_t);
193static uint32_t bwn_pio_rx_read_4(struct bwn_pio_rxqueue *, uint16_t);
194static void bwn_pio_rx_write_2(struct bwn_pio_rxqueue *, uint16_t,
195 uint16_t);
196static void bwn_pio_rx_write_4(struct bwn_pio_rxqueue *, uint16_t,
197 uint32_t);
198static int bwn_pio_tx_start(struct bwn_mac *, struct ieee80211_node *,
32
33/*
34 * The Broadcom Wireless LAN controller driver.
35 */
36
37#include "opt_bwn.h"
38#include "opt_wlan.h"
39

--- 151 unchanged lines hidden (view full) ---

191 const struct bwn_txstatus *);
192static uint16_t bwn_pio_rx_read_2(struct bwn_pio_rxqueue *, uint16_t);
193static uint32_t bwn_pio_rx_read_4(struct bwn_pio_rxqueue *, uint16_t);
194static void bwn_pio_rx_write_2(struct bwn_pio_rxqueue *, uint16_t,
195 uint16_t);
196static void bwn_pio_rx_write_4(struct bwn_pio_rxqueue *, uint16_t,
197 uint32_t);
198static int bwn_pio_tx_start(struct bwn_mac *, struct ieee80211_node *,
199 struct mbuf *);
199 struct mbuf **);
200static struct bwn_pio_txqueue *bwn_pio_select(struct bwn_mac *, uint8_t);
201static uint32_t bwn_pio_write_multi_4(struct bwn_mac *,
202 struct bwn_pio_txqueue *, uint32_t, const void *, int);
203static void bwn_pio_write_4(struct bwn_mac *, struct bwn_pio_txqueue *,
204 uint16_t, uint32_t);
205static uint16_t bwn_pio_write_multi_2(struct bwn_mac *,
206 struct bwn_pio_txqueue *, uint16_t, const void *, int);
207static uint16_t bwn_pio_write_mbuf_2(struct bwn_mac *,

--- 48 unchanged lines hidden (view full) ---

256 struct bwn_dmadesc_generic *, struct bwn_dmadesc_meta *,
257 int);
258static void bwn_dma_buf_addr(void *, bus_dma_segment_t *, int,
259 bus_size_t, int);
260static uint8_t bwn_dma_check_redzone(struct bwn_dma_ring *, struct mbuf *);
261static void bwn_dma_handle_txeof(struct bwn_mac *,
262 const struct bwn_txstatus *);
263static int bwn_dma_tx_start(struct bwn_mac *, struct ieee80211_node *,
200static struct bwn_pio_txqueue *bwn_pio_select(struct bwn_mac *, uint8_t);
201static uint32_t bwn_pio_write_multi_4(struct bwn_mac *,
202 struct bwn_pio_txqueue *, uint32_t, const void *, int);
203static void bwn_pio_write_4(struct bwn_mac *, struct bwn_pio_txqueue *,
204 uint16_t, uint32_t);
205static uint16_t bwn_pio_write_multi_2(struct bwn_mac *,
206 struct bwn_pio_txqueue *, uint16_t, const void *, int);
207static uint16_t bwn_pio_write_mbuf_2(struct bwn_mac *,

--- 48 unchanged lines hidden (view full) ---

256 struct bwn_dmadesc_generic *, struct bwn_dmadesc_meta *,
257 int);
258static void bwn_dma_buf_addr(void *, bus_dma_segment_t *, int,
259 bus_size_t, int);
260static uint8_t bwn_dma_check_redzone(struct bwn_dma_ring *, struct mbuf *);
261static void bwn_dma_handle_txeof(struct bwn_mac *,
262 const struct bwn_txstatus *);
263static int bwn_dma_tx_start(struct bwn_mac *, struct ieee80211_node *,
264 struct mbuf *);
264 struct mbuf **);
265static int bwn_dma_getslot(struct bwn_dma_ring *);
266static struct bwn_dma_ring *bwn_dma_select(struct bwn_mac *,
267 uint8_t);
268static int bwn_dma_attach(struct bwn_mac *);
269static struct bwn_dma_ring *bwn_dma_ringsetup(struct bwn_mac *,
270 int, int, int);
271static struct bwn_dma_ring *bwn_dma_parse_cookie(struct bwn_mac *,
272 const struct bwn_txstatus *, uint16_t, int *);

--- 659 unchanged lines hidden (view full) ---

932 BWN_ASSERT_LOCKED(sc);
933
934 if (m->m_pkthdr.len < IEEE80211_MIN_LEN || mac == NULL) {
935 m_freem(m);
936 return (ENXIO);
937 }
938
939 error = (mac->mac_flags & BWN_MAC_FLAG_DMA) ?
265static int bwn_dma_getslot(struct bwn_dma_ring *);
266static struct bwn_dma_ring *bwn_dma_select(struct bwn_mac *,
267 uint8_t);
268static int bwn_dma_attach(struct bwn_mac *);
269static struct bwn_dma_ring *bwn_dma_ringsetup(struct bwn_mac *,
270 int, int, int);
271static struct bwn_dma_ring *bwn_dma_parse_cookie(struct bwn_mac *,
272 const struct bwn_txstatus *, uint16_t, int *);

--- 659 unchanged lines hidden (view full) ---

932 BWN_ASSERT_LOCKED(sc);
933
934 if (m->m_pkthdr.len < IEEE80211_MIN_LEN || mac == NULL) {
935 m_freem(m);
936 return (ENXIO);
937 }
938
939 error = (mac->mac_flags & BWN_MAC_FLAG_DMA) ?
940 bwn_dma_tx_start(mac, ni, m) : bwn_pio_tx_start(mac, ni, m);
940 bwn_dma_tx_start(mac, ni, &m) : bwn_pio_tx_start(mac, ni, &m);
941 if (error) {
942 m_freem(m);
943 return (error);
944 }
945 return (0);
946}
947
948static int
941 if (error) {
942 m_freem(m);
943 return (error);
944 }
945 return (0);
946}
947
948static int
949bwn_pio_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, struct mbuf *m)
949bwn_pio_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni,
950 struct mbuf **mp)
950{
951 struct bwn_pio_txpkt *tp;
951{
952 struct bwn_pio_txpkt *tp;
952 struct bwn_pio_txqueue *tq = bwn_pio_select(mac, M_WME_GETAC(m));
953 struct bwn_pio_txqueue *tq;
953 struct bwn_softc *sc = mac->mac_sc;
954 struct bwn_txhdr txhdr;
954 struct bwn_softc *sc = mac->mac_sc;
955 struct bwn_txhdr txhdr;
955 struct mbuf *m_new;
956 struct mbuf *m, *m_new;
956 uint32_t ctl32;
957 int error;
958 uint16_t ctl16;
959
960 BWN_ASSERT_LOCKED(sc);
961
962 /* XXX TODO send packets after DTIM */
963
957 uint32_t ctl32;
958 int error;
959 uint16_t ctl16;
960
961 BWN_ASSERT_LOCKED(sc);
962
963 /* XXX TODO send packets after DTIM */
964
965 m = *mp;
966 tq = bwn_pio_select(mac, M_WME_GETAC(m));
964 KASSERT(!TAILQ_EMPTY(&tq->tq_pktlist), ("%s: fail", __func__));
965 tp = TAILQ_FIRST(&tq->tq_pktlist);
966 tp->tp_ni = ni;
967 tp->tp_m = m;
968
969 error = bwn_set_txhdr(mac, ni, m, &txhdr, BWN_PIO_COOKIE(tq, tp));
970 if (error) {
971 device_printf(sc->sc_dev, "tx fail\n");
972 return (error);
973 }
974
975 TAILQ_REMOVE(&tq->tq_pktlist, tp, tp_list);
976 tq->tq_used += roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4);
977 tq->tq_free--;
978
979 if (siba_get_revid(sc->sc_dev) >= 8) {
980 /*
981 * XXX please removes m_defrag(9)
982 */
967 KASSERT(!TAILQ_EMPTY(&tq->tq_pktlist), ("%s: fail", __func__));
968 tp = TAILQ_FIRST(&tq->tq_pktlist);
969 tp->tp_ni = ni;
970 tp->tp_m = m;
971
972 error = bwn_set_txhdr(mac, ni, m, &txhdr, BWN_PIO_COOKIE(tq, tp));
973 if (error) {
974 device_printf(sc->sc_dev, "tx fail\n");
975 return (error);
976 }
977
978 TAILQ_REMOVE(&tq->tq_pktlist, tp, tp_list);
979 tq->tq_used += roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4);
980 tq->tq_free--;
981
982 if (siba_get_revid(sc->sc_dev) >= 8) {
983 /*
984 * XXX please removes m_defrag(9)
985 */
983 m_new = m_defrag(m, M_NOWAIT);
986 m_new = m_defrag(*mp, M_NOWAIT);
984 if (m_new == NULL) {
985 device_printf(sc->sc_dev,
986 "%s: can't defrag TX buffer\n",
987 __func__);
988 return (ENOBUFS);
989 }
987 if (m_new == NULL) {
988 device_printf(sc->sc_dev,
989 "%s: can't defrag TX buffer\n",
990 __func__);
991 return (ENOBUFS);
992 }
993 *mp = m_new;
990 if (m_new->m_next != NULL)
991 device_printf(sc->sc_dev,
992 "TODO: fragmented packets for PIO\n");
993 tp->tp_m = m_new;
994
995 /* send HEADER */
996 ctl32 = bwn_pio_write_multi_4(mac, tq,
997 (BWN_PIO_READ_4(mac, tq, BWN_PIO8_TXCTL) |

--- 34 unchanged lines hidden (view full) ---

1032 case 3:
1033 return (&mac->mac_method.pio.wme[WME_AC_VO]);
1034 }
1035 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__));
1036 return (NULL);
1037}
1038
1039static int
994 if (m_new->m_next != NULL)
995 device_printf(sc->sc_dev,
996 "TODO: fragmented packets for PIO\n");
997 tp->tp_m = m_new;
998
999 /* send HEADER */
1000 ctl32 = bwn_pio_write_multi_4(mac, tq,
1001 (BWN_PIO_READ_4(mac, tq, BWN_PIO8_TXCTL) |

--- 34 unchanged lines hidden (view full) ---

1036 case 3:
1037 return (&mac->mac_method.pio.wme[WME_AC_VO]);
1038 }
1039 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__));
1040 return (NULL);
1041}
1042
1043static int
1040bwn_dma_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, struct mbuf *m)
1044bwn_dma_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni,
1045 struct mbuf **mp)
1041{
1042#define BWN_GET_TXHDRCACHE(slot) \
1043 &(txhdr_cache[(slot / BWN_TX_SLOTS_PER_FRAME) * BWN_HDRSIZE(mac)])
1044 struct bwn_dma *dma = &mac->mac_method.dma;
1046{
1047#define BWN_GET_TXHDRCACHE(slot) \
1048 &(txhdr_cache[(slot / BWN_TX_SLOTS_PER_FRAME) * BWN_HDRSIZE(mac)])
1049 struct bwn_dma *dma = &mac->mac_method.dma;
1045 struct bwn_dma_ring *dr = bwn_dma_select(mac, M_WME_GETAC(m));
1050 struct bwn_dma_ring *dr = bwn_dma_select(mac, M_WME_GETAC(*mp));
1046 struct bwn_dmadesc_generic *desc;
1047 struct bwn_dmadesc_meta *mt;
1048 struct bwn_softc *sc = mac->mac_sc;
1051 struct bwn_dmadesc_generic *desc;
1052 struct bwn_dmadesc_meta *mt;
1053 struct bwn_softc *sc = mac->mac_sc;
1054 struct mbuf *m;
1049 uint8_t *txhdr_cache = (uint8_t *)dr->dr_txhdr_cache;
1050 int error, slot, backup[2] = { dr->dr_curslot, dr->dr_usedslot };
1051
1052 BWN_ASSERT_LOCKED(sc);
1053 KASSERT(!dr->dr_stop, ("%s:%d: fail", __func__, __LINE__));
1054
1055 /* XXX send after DTIM */
1056
1055 uint8_t *txhdr_cache = (uint8_t *)dr->dr_txhdr_cache;
1056 int error, slot, backup[2] = { dr->dr_curslot, dr->dr_usedslot };
1057
1058 BWN_ASSERT_LOCKED(sc);
1059 KASSERT(!dr->dr_stop, ("%s:%d: fail", __func__, __LINE__));
1060
1061 /* XXX send after DTIM */
1062
1063 m = *mp;
1057 slot = bwn_dma_getslot(dr);
1058 dr->getdesc(dr, slot, &desc, &mt);
1059 KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_HEADER,
1060 ("%s:%d: fail", __func__, __LINE__));
1061
1062 error = bwn_set_txhdr(dr->dr_mac, ni, m,
1063 (struct bwn_txhdr *)BWN_GET_TXHDRCACHE(slot),
1064 BWN_DMA_COOKIE(dr, slot));

--- 32 unchanged lines hidden (view full) ---

1097
1098 m_new = m_defrag(m, M_NOWAIT);
1099 if (m_new == NULL) {
1100 device_printf(sc->sc_dev,
1101 "%s: can't defrag TX buffer\n",
1102 __func__);
1103 error = ENOBUFS;
1104 goto fail;
1064 slot = bwn_dma_getslot(dr);
1065 dr->getdesc(dr, slot, &desc, &mt);
1066 KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_HEADER,
1067 ("%s:%d: fail", __func__, __LINE__));
1068
1069 error = bwn_set_txhdr(dr->dr_mac, ni, m,
1070 (struct bwn_txhdr *)BWN_GET_TXHDRCACHE(slot),
1071 BWN_DMA_COOKIE(dr, slot));

--- 32 unchanged lines hidden (view full) ---

1104
1105 m_new = m_defrag(m, M_NOWAIT);
1106 if (m_new == NULL) {
1107 device_printf(sc->sc_dev,
1108 "%s: can't defrag TX buffer\n",
1109 __func__);
1110 error = ENOBUFS;
1111 goto fail;
1105 } else {
1106 m = m_new;
1107 }
1112 }
1113 *mp = m = m_new;
1108
1109 mt->mt_m = m;
1110 error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap,
1111 m, bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT);
1112 if (error) {
1113 device_printf(sc->sc_dev,
1114 "%s: can't load TX buffer (2) %d\n",
1115 __func__, error);

--- 6371 unchanged lines hidden ---
1114
1115 mt->mt_m = m;
1116 error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap,
1117 m, bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT);
1118 if (error) {
1119 device_printf(sc->sc_dev,
1120 "%s: can't load TX buffer (2) %d\n",
1121 __func__, error);

--- 6371 unchanged lines hidden ---