Lines Matching +full:ch +full:- +full:func
1 /*-
2 * Copyright (c) 2016-2017 Ilya Bakulin
79 …() which is defined as probe function in struct sdio_driver. http://lxr.free-electrons.com/source/…
81 …e driver does black magic by copying func struct for F2 and setting func number to zero there, to …
83 …* ops_sdio_probe() then calls brcmf_sdio_probe() -- at this point it has filled in sdiodev struct …
89 …* Finally it calls brcmf_sdio_probe() http://lxr.free-electrons.com/source/drivers/net/wireless/br…
91 * Here high-level workqueues and sg tables are allocated.
96 * Then turns off PLL: byte-write BRCMF_INIT_CLKCTL1 (0x28) -> SBSDIO_FUNC1_CHIPCLKCSR (0x1000E)
100 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L10…
101 * This func enumerates and resets all the cores on the dongle.
102 * - brcmf_sdio_buscoreprep(): force clock to ALPAvail req only:
103 * SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ -> SBSDIO_FUNC1_CHIPCLKCSR
106 * SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP (0x21)-> SBSDIO_FUNC1_CHIPCLKCSR
108 * byte 0 -> SBSDIO_FUNC1_SDIOPULLUP (0x0001000f)
111 * http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L908
120 * http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L700
124 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c#L10…
125 * Bus-specific setup code is NOP for SDIO.
131 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c#L36…
137 …**** Finished reading at http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80…
140 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c#L…
141 * The address to read from is written to three byte-sized registers of F1:
142 * - SBSDIO_FUNC1_SBADDRLOW 0x1000A
143 * - SBSDIO_FUNC1_SBADDRMID 0x1000B
144 * - SBSDIO_FUNC1_SBADDRHIGH 0x1000C
145 …* If this is 32-bit read , a flag is set. The address is ANDed with SBSDIO_SB_OFT_ADDR_MASK which …
147 …* http://lxr.free-electrons.com/source/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c#L…
150 * 1-byte IO is done with CMD52, more is read with CMD53 with address increment (not FIFO mode).
151 * http://lxr.free-electrons.com/source/drivers/mmc/core/sdio_io.c#L458
157 /* BRCM-specific functions */
169 struct sdio_func *func[8]; member
193 bus->state = state; in brcmf_bus_change_state()
199 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM || in brcmf_sdiod_change_state()
200 state == sdiodev->state) in brcmf_sdiod_change_state()
203 //brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state); in brcmf_sdiod_change_state()
204 switch (sdiodev->state) { in brcmf_sdiod_change_state()
207 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN); in brcmf_sdiod_change_state()
212 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP); in brcmf_sdiod_change_state()
217 sdiodev->state = state; in brcmf_sdiod_change_state()
220 static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, in brcmf_sdiod_f0_writeb() argument
231 sdio_writeb(func, byte, regaddr, &err_ret); in brcmf_sdiod_f0_writeb()
233 sdio_f0_writeb(func, byte, regaddr, &err_ret); in brcmf_sdiod_f0_writeb()
240 struct sdio_func *func; in brcmf_sdiod_request_data() local
241 int ret = -EINVAL; in brcmf_sdiod_request_data()
243 brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", in brcmf_sdiod_request_data()
248 return -EINVAL; in brcmf_sdiod_request_data()
249 func = sdiodev->func[fn]; in brcmf_sdiod_request_data()
255 sdio_writeb(func, *(u8 *)data, addr, &ret); in brcmf_sdiod_request_data()
257 ret = brcmf_sdiod_f0_writeb(func, addr, in brcmf_sdiod_request_data()
261 *(u8 *)data = sdio_readb(func, addr, &ret); in brcmf_sdiod_request_data()
263 *(u8 *)data = sdio_f0_readb(func, addr, &ret); in brcmf_sdiod_request_data()
268 sdio_writew(func, *(u16 *)data, addr, &ret); in brcmf_sdiod_request_data()
270 *(u16 *)data = sdio_readw(func, addr, &ret); in brcmf_sdiod_request_data()
274 sdio_writel(func, *(u32 *)data, addr, &ret); in brcmf_sdiod_request_data()
276 *(u32 *)data = sdio_readl(func, addr, &ret); in brcmf_sdiod_request_data()
296 if (bar0 != sdiodev->sbwad) { in brcmf_sdiod_addrprep()
301 sdiodev->sbwad = bar0; in brcmf_sdiod_addrprep()
313 u8 func; in brcmf_sdiod_regrw_helper() local
317 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) in brcmf_sdiod_regrw_helper()
318 return -ENOMEDIUM; in brcmf_sdiod_regrw_helper()
327 func = SDIO_FUNC_0; in brcmf_sdiod_regrw_helper()
329 func = SDIO_FUNC_1; in brcmf_sdiod_regrw_helper()
337 ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz, in brcmf_sdiod_regrw_helper()
339 } while (ret != 0 && ret != -ENOMEDIUM && in brcmf_sdiod_regrw_helper()
342 if (ret == -ENOMEDIUM) in brcmf_sdiod_regrw_helper()
352 write ? "write" : "read", func, addr, ret); in brcmf_sdiod_regrw_helper()
355 write ? "write" : "read", func, addr, ret); in brcmf_sdiod_regrw_helper()
366 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) in brcmf_sdiod_set_sbaddr_window()
367 return -ENOMEDIUM; in brcmf_sdiod_set_sbaddr_window()
425 const char fw_path[] = "/home/kibab/repos/fbsd-bbb/brcm-firmware/brcmfmac4330-sdio.bin"; in mmap_fw()
443 printf("sdiotool -u <pass_dev_unit>\n"); in usage()
466 sdio_func_read_cis(dev, 0, cis_addr, &ci->f[0]); in get_sdio_card_info()
468 ci->f[0].man_id, ci->f[0].prod_id, ci->f[0].max_block_size); in get_sdio_card_info()
474 sdio_func_read_cis(dev, i, cis_addr, &ci->f[i]); in get_sdio_card_info()
476 i, ci->f[i].man_id, ci->f[i].prod_id, ci->f[i].max_block_size); in get_sdio_card_info()
477 if (ci->f[i].man_id == 0) { in get_sdio_card_info()
481 ci->num_funcs++; in get_sdio_card_info()
489 int func = 0; in main() local
491 int ch; in main() local
498 while ((ch = getopt(argc, argv, "fu:")) != -1) { in main()
499 switch (ch) { in main()
504 func = (int) strtol(optarg, NULL, 10); in main()
511 argc -= optind; in main()
519 /* For now, everything non-broadcom is out of the question */ in main()
534 brcmf_dev.func[0] = &f0; in main()
535 brcmf_dev.func[1] = &f1; in main()
536 brcmf_dev.func[2] = &f2; in main()
538 brcmf_dev.func[0]->dev = brcmf_dev.func[1]->dev in main()
539 = brcmf_dev.func[2]->dev = cam_dev; in main()
540 brcmf_dev.func[0]->num = 0; in main()
541 brcmf_dev.func[1]->num = 1; in main()
542 brcmf_dev.func[2]->num = 2; in main()