17453645fSAndriy Voskoboinyk /* $OpenBSD: if_rtwn.c,v 1.6 2015/08/28 00:03:53 deraadt Exp $ */ 27453645fSAndriy Voskoboinyk 37453645fSAndriy Voskoboinyk /*- 47453645fSAndriy Voskoboinyk * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 57453645fSAndriy Voskoboinyk * Copyright (c) 2015 Stefan Sperling <stsp@openbsd.org> 67453645fSAndriy Voskoboinyk * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org> 77453645fSAndriy Voskoboinyk * 87453645fSAndriy Voskoboinyk * Permission to use, copy, modify, and distribute this software for any 97453645fSAndriy Voskoboinyk * purpose with or without fee is hereby granted, provided that the above 107453645fSAndriy Voskoboinyk * copyright notice and this permission notice appear in all copies. 117453645fSAndriy Voskoboinyk * 127453645fSAndriy Voskoboinyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 137453645fSAndriy Voskoboinyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 147453645fSAndriy Voskoboinyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 157453645fSAndriy Voskoboinyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 167453645fSAndriy Voskoboinyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 177453645fSAndriy Voskoboinyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 187453645fSAndriy Voskoboinyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 197453645fSAndriy Voskoboinyk */ 207453645fSAndriy Voskoboinyk 217453645fSAndriy Voskoboinyk #include <sys/cdefs.h> 227453645fSAndriy Voskoboinyk __FBSDID("$FreeBSD$"); 237453645fSAndriy Voskoboinyk 247453645fSAndriy Voskoboinyk #include <sys/param.h> 257453645fSAndriy Voskoboinyk #include <sys/lock.h> 267453645fSAndriy Voskoboinyk #include <sys/mutex.h> 277453645fSAndriy Voskoboinyk #include <sys/mbuf.h> 287453645fSAndriy Voskoboinyk #include <sys/kernel.h> 297453645fSAndriy Voskoboinyk #include <sys/socket.h> 307453645fSAndriy Voskoboinyk #include <sys/systm.h> 317453645fSAndriy Voskoboinyk #include <sys/malloc.h> 327453645fSAndriy Voskoboinyk #include <sys/queue.h> 337453645fSAndriy Voskoboinyk #include <sys/taskqueue.h> 347453645fSAndriy Voskoboinyk #include <sys/bus.h> 357453645fSAndriy Voskoboinyk #include <sys/endian.h> 367453645fSAndriy Voskoboinyk 377453645fSAndriy Voskoboinyk #include <machine/bus.h> 387453645fSAndriy Voskoboinyk #include <machine/resource.h> 397453645fSAndriy Voskoboinyk #include <sys/rman.h> 407453645fSAndriy Voskoboinyk 417453645fSAndriy Voskoboinyk #include <net/if.h> 427453645fSAndriy Voskoboinyk #include <net/ethernet.h> 437453645fSAndriy Voskoboinyk #include <net/if_media.h> 447453645fSAndriy Voskoboinyk 457453645fSAndriy Voskoboinyk #include <net80211/ieee80211_var.h> 467453645fSAndriy Voskoboinyk #include <net80211/ieee80211_radiotap.h> 477453645fSAndriy Voskoboinyk 487453645fSAndriy Voskoboinyk #include <dev/rtwn/if_rtwnvar.h> 497453645fSAndriy Voskoboinyk 507453645fSAndriy Voskoboinyk #include <dev/rtwn/pci/rtwn_pci_var.h> 517453645fSAndriy Voskoboinyk #include <dev/rtwn/pci/rtwn_pci_reg.h> 527453645fSAndriy Voskoboinyk 537453645fSAndriy Voskoboinyk 547453645fSAndriy Voskoboinyk int 557453645fSAndriy Voskoboinyk rtwn_pci_write_1(struct rtwn_softc *sc, uint16_t addr, uint8_t val) 567453645fSAndriy Voskoboinyk { 577453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 587453645fSAndriy Voskoboinyk 597453645fSAndriy Voskoboinyk bus_space_write_1(pc->pc_st, pc->pc_sh, addr, val); 607453645fSAndriy Voskoboinyk 617453645fSAndriy Voskoboinyk return (0); 627453645fSAndriy Voskoboinyk } 637453645fSAndriy Voskoboinyk 647453645fSAndriy Voskoboinyk int 657453645fSAndriy Voskoboinyk rtwn_pci_write_2(struct rtwn_softc *sc, uint16_t addr, uint16_t val) 667453645fSAndriy Voskoboinyk { 677453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 687453645fSAndriy Voskoboinyk 697453645fSAndriy Voskoboinyk val = htole16(val); 707453645fSAndriy Voskoboinyk bus_space_write_2(pc->pc_st, pc->pc_sh, addr, val); 717453645fSAndriy Voskoboinyk 727453645fSAndriy Voskoboinyk return (0); 737453645fSAndriy Voskoboinyk } 747453645fSAndriy Voskoboinyk 757453645fSAndriy Voskoboinyk int 767453645fSAndriy Voskoboinyk rtwn_pci_write_4(struct rtwn_softc *sc, uint16_t addr, uint32_t val) 777453645fSAndriy Voskoboinyk { 787453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 797453645fSAndriy Voskoboinyk 807453645fSAndriy Voskoboinyk val = htole32(val); 817453645fSAndriy Voskoboinyk bus_space_write_4(pc->pc_st, pc->pc_sh, addr, val); 827453645fSAndriy Voskoboinyk 837453645fSAndriy Voskoboinyk return (0); 847453645fSAndriy Voskoboinyk } 857453645fSAndriy Voskoboinyk 867453645fSAndriy Voskoboinyk uint8_t 877453645fSAndriy Voskoboinyk rtwn_pci_read_1(struct rtwn_softc *sc, uint16_t addr) 887453645fSAndriy Voskoboinyk { 897453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 907453645fSAndriy Voskoboinyk 917453645fSAndriy Voskoboinyk return (bus_space_read_1(pc->pc_st, pc->pc_sh, addr)); 927453645fSAndriy Voskoboinyk } 937453645fSAndriy Voskoboinyk 947453645fSAndriy Voskoboinyk uint16_t 957453645fSAndriy Voskoboinyk rtwn_pci_read_2(struct rtwn_softc *sc, uint16_t addr) 967453645fSAndriy Voskoboinyk { 977453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 987453645fSAndriy Voskoboinyk uint16_t val; 997453645fSAndriy Voskoboinyk 1007453645fSAndriy Voskoboinyk val = bus_space_read_2(pc->pc_st, pc->pc_sh, addr); 1017453645fSAndriy Voskoboinyk return le16toh(val); 1027453645fSAndriy Voskoboinyk } 1037453645fSAndriy Voskoboinyk 1047453645fSAndriy Voskoboinyk uint32_t 1057453645fSAndriy Voskoboinyk rtwn_pci_read_4(struct rtwn_softc *sc, uint16_t addr) 1067453645fSAndriy Voskoboinyk { 1077453645fSAndriy Voskoboinyk struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 1087453645fSAndriy Voskoboinyk uint32_t val; 1097453645fSAndriy Voskoboinyk 1107453645fSAndriy Voskoboinyk val = bus_space_read_4(pc->pc_st, pc->pc_sh, addr); 1117453645fSAndriy Voskoboinyk return le32toh(val); 1127453645fSAndriy Voskoboinyk } 1137453645fSAndriy Voskoboinyk 1147453645fSAndriy Voskoboinyk void 1157453645fSAndriy Voskoboinyk rtwn_pci_delay(struct rtwn_softc *sc, int usec) 1167453645fSAndriy Voskoboinyk { 1177453645fSAndriy Voskoboinyk if (usec < 1000) 1187453645fSAndriy Voskoboinyk DELAY(usec); 1197453645fSAndriy Voskoboinyk else { 1207453645fSAndriy Voskoboinyk (void) mtx_sleep(sc, &sc->sc_mtx, 0, "rtwn_pci", 121*9df9e936SAndriy Voskoboinyk msecs_to_ticks(usec / 1000)); 1227453645fSAndriy Voskoboinyk } 1237453645fSAndriy Voskoboinyk } 124