BHND(9) | Kernel Developer's Manual | BHND(9) |
bhnd
— BHND driver
programming interface
#include
<dev/bhnd/bhnd.h>
int
bhnd_activate_resource
(device_t
dev, int type, int rid,
struct bhnd_resource *r);
struct bhnd_resource *
bhnd_alloc_resource
(device_t
dev, int type, int *rid,
rman_res_t start, rman_res_t
end, rman_res_t count, u_int
flags);
struct bhnd_resource *
bhnd_alloc_resource_any
(device_t
dev, int type, int *rid,
u_int flags);
int
bhnd_alloc_resources
(device_t
dev, struct resource_spec *rs,
struct bhnd_resource **res);
int
bhnd_deactivate_resource
(device_t
dev, int type, int rid,
struct bhnd_resource *r);
int
bhnd_release_resource
(device_t
dev, int type, int rid,
struct bhnd_resource *r);
void
bhnd_release_resources
(device_t
dev, const struct resource_spec *rs,
struct bhnd_resource **res);
void
bhnd_bus_barrier
(struct bhnd_resource
*r, bus_size_t offset,
bus_size_t length, int
flags);
uint8_t
bhnd_bus_read_1
(struct
bhnd_resource *r,
bus_size_t offset);
uint16_t
bhnd_bus_read_2
(struct
bhnd_resource *r,
bus_size_t offset);
uint32_t
bhnd_bus_read_4
(struct
bhnd_resource *r,
bus_size_t offset);
void
bhnd_bus_read_multi_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_read_multi_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_read_multi_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_read_multi_stream_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_read_multi_stream_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_read_multi_stream_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_stream_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_stream_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_read_region_stream_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_read_stream_1
(struct
bhnd_resource *r,
bus_size_t offset);
void
bhnd_bus_read_stream_2
(struct
bhnd_resource *r,
bus_size_t offset);
uint32_t
bhnd_bus_read_stream_4
(struct
bhnd_resource *r,
bus_size_t offset);
void
bhnd_bus_set_multi_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t value, bus_size_t
count);
void
bhnd_bus_set_multi_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t value, bus_size_t
count);
void
bhnd_bus_set_multi_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t value, bus_size_t
count);
void
bhnd_bus_set_region_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t value, bus_size_t
count);
void
bhnd_bus_set_region_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t value, bus_size_t
count);
void
bhnd_bus_set_region_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t value, bus_size_t
count);
void
bhnd_bus_write_1
(struct
bhnd_resource *r, uint8_t
value);
void
bhnd_bus_write_2
(struct
bhnd_resource *r,
uint16_t value);
void
bhnd_bus_write_4
(struct
bhnd_resource *r,
uint32_t value);
void
bhnd_bus_write_multi_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_write_multi_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_write_multi_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_write_multi_stream_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_write_multi_stream_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_write_multi_stream_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_stream_1
(struct
bhnd_resource *r, bus_size_t offset,
uint8_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_stream_2
(struct
bhnd_resource *r, bus_size_t offset,
uint16_t *datap, bus_size_t
count);
void
bhnd_bus_write_region_stream_4
(struct
bhnd_resource *r, bus_size_t offset,
uint32_t *datap, bus_size_t
count);
void
bhnd_bus_write_stream_1
(struct
bhnd_resource *r, uint8_t
value);
void
bhnd_bus_write_stream_2
(struct
bhnd_resource *r,
uint16_t value);
void
bhnd_bus_write_stream_4
(struct
bhnd_resource *r,
uint32_t value);
int
bhnd_read_ioctl
(device_t
dev, uint16_t
*ioctl);
int
bhnd_write_ioctl
(device_t
dev, uint16_t
value, uint16_t
mask);
int
bhnd_read_iost
(device_t
dev, uint16_t
*iost);
uint32_t
bhnd_read_config
(device_t dev,
bus_size_t offset, void *value,
u_int width);
int
bhnd_write_config
(device_t dev,
bus_size_t offset, const void
*value, u_int width);
int
bhnd_reset_hw
(device_t
dev, uint16_t
ioctl, uint16_t
reset_ioctl);
int
bhnd_suspend_hw
(device_t
dev, uint16_t
ioctl);
bool
bhnd_is_hw_suspended
(device_t
dev);
bhnd_attach_type
bhnd_get_attach_type
(device_t
dev);
const struct bhnd_chipid *
bhnd_get_chipid
(device_t
dev);
bhnd_devclass_t
bhnd_get_class
(device_t
dev);
u_int
bhnd_get_core_index
(device_t
dev);
struct bhnd_core_info
bhnd_get_core_info
(device_t
dev);
int
bhnd_get_core_unit
(device_t
dev);
uint16_t
bhnd_get_device
(device_t
dev);
const char *
bhnd_get_device_name
(device_t
dev);
uint8_t
bhnd_get_hwrev
(device_t
dev);
uint16_t
bhnd_get_vendor
(device_t
dev);
const char *
bhnd_get_vendor_name
(device_t
dev);
int
bhnd_read_board_info
(device_t
dev, struct bhnd_board_info *info);
bool
bhnd_board_matches
(const struct
bhnd_board_info *board, const struct bhnd_board_match
*desc);
device_t
bhnd_bus_match_child
(device_t
bus, const struct bhnd_core_match *desc);
bool
bhnd_chip_matches
(const struct
bhnd_chipid *chip, const struct bhnd_chip_match
*desc);
struct bhnd_core_match
bhnd_core_get_match_desc
(const struct
bhnd_core_info *core);
bool
bhnd_core_matches
(const struct
bhnd_core_info *core, const struct bhnd_core_match
*desc);
bool
bhnd_cores_equal
(const struct
bhnd_core_info *lhs, const struct bhnd_core_info
*rhs);
bool
bhnd_hwrev_matches
(uint16_t
hwrev, const struct bhnd_hwrev_match *desc);
const struct bhnd_core_info *
bhnd_match_core
(const struct
bhnd_core_info *cores, u_int num_cores,
const struct bhnd_core_match *desc);
const struct bhnd_device *
bhnd_device_lookup
(device_t dev,
const struct bhnd_device *table,
size_t entry_size);
bool
bhnd_device_matches
(device_t
dev, const struct bhnd_device_match *desc);
uint32_t
bhnd_device_quirks
(device_t dev,
const struct bhnd_device *table,
size_t entry_size);
BHND_BOARD_QUIRK
(board,
flags);
BHND_CHIP_QUIRK
(chip,
hwrev, flags);
BHND_CORE_QUIRK
(hwrev,
flags);
BHND_DEVICE
(vendor,
device, desc,
quirks, ...);
BHND_DEVICE_IS_END
(struct
bhnd_device *d);
BHND_DEVICE_QUIRK_IS_END
(struct
bhnd_device_quirk *q);
BHND_PKG_QUIRK
(chip,
pkg, flags);
struct bhnd_device_quirk { struct bhnd_device_match desc; uint32_t quirks; };
struct bhnd_device { const struct bhnd_device_match core; const char *desc; const struct bhnd_device_quirk *quirks_table; uint32_t device_flags; };
enum { BHND_DF_ANY = 0, BHND_DF_HOSTB = (1 << 0), BHND_DF_SOC = (1 << 1), BHND_DF_ADAPTER = (1 << 2) };
#define BHND_DEVICE_END { { BHND_MATCH_ANY }, NULL, NULL, 0 }
#define BHND_DEVICE_QUIRK_END { { BHND_MATCH_ANY }, 0 }
int
bhnd_get_dma_translation
(device_t
dev, u_int width, uint32_t
flags, bus_dma_tag_t *dmat,
struct bhnd_dma_translation *translation);
struct bhnd_dma_translation { bhnd_addr_t base_addr; bhnd_addr_t addr_mask; bhnd_addr_t addrext_mask; uint32_t flags; };
typedef enum { BHND_DMA_ADDR_30BIT = 30, BHND_DMA_ADDR_32BIT = 32, BHND_DMA_ADDR_64BIT = 64 } bhnd_dma_addrwidth;
enum bhnd_dma_translation_flags { BHND_DMA_TRANSLATION_PHYSMAP = (1<<0), BHND_DMA_TRANSLATION_BYTESWAPPED = (1<<1) };
u_int
bhnd_get_intr_count
(device_t
dev);
int
bhnd_get_intr_ivec
(device_t dev,
u_int intr, u_int *ivec);
int
bhnd_map_intr
(device_t dev,
u_int intr, rman_res_t
*irq);
void
bhnd_unmap_intr
(device_t dev,
rman_res_t irq);
int
bhnd_nvram_getvar
(device_t dev,
const char *name, void *buf,
size_t *len, bhnd_nvram_type
type);
int
bhnd_nvram_getvar_array
(device_t
dev, const char *name, void
*buf, size_t size,
bhnd_nvram_type type);
int
bhnd_nvram_getvar_int
(device_t
dev, const char *name, void
*value, int width);
int
bhnd_nvram_getvar_int8
(device_t
dev, const char
*name, int8_t
*value);
int
bhnd_nvram_getvar_int16
(device_t
dev, const char
*name, int16_t
*value);
int
bhnd_nvram_getvar_int32
(device_t
dev, const char
*name, int32_t
*value);
int
bhnd_nvram_getvar_uint
(device_t
dev, const char *name, void
*value, int width);
int
bhnd_nvram_getvar_uint8
(device_t
dev, const char *name, uint8_t
*value);
int
bhnd_nvram_getvar_uint16
(device_t
dev, const char *name, uint16_t
*value);
int
bhnd_nvram_getvar_uint32
(device_t
dev, const char *name, uint32_t
*value);
int
bhnd_nvram_getvar_str
(device_t
dev, const char *name, char
*buf, size_t len, size_t
*rlen);
const char *
bhnd_nvram_string_array_next
(const
char *inp, size_t ilen, const
char *prev, size_t *olen);
typedef enum { BHND_NVRAM_TYPE_UINT8 = 0, BHND_NVRAM_TYPE_UINT16 = 1, BHND_NVRAM_TYPE_UINT32 = 2, BHND_NVRAM_TYPE_UINT64 = 3, BHND_NVRAM_TYPE_INT8 = 4, BHND_NVRAM_TYPE_INT16 = 5, BHND_NVRAM_TYPE_INT32 = 6, BHND_NVRAM_TYPE_INT64 = 7, BHND_NVRAM_TYPE_CHAR = 8, BHND_NVRAM_TYPE_STRING = 9, BHND_NVRAM_TYPE_BOOL = 10, BHND_NVRAM_TYPE_NULL = 11, BHND_NVRAM_TYPE_DATA = 12 BHND_NVRAM_TYPE_UINT8_ARRAY = 16, BHND_NVRAM_TYPE_UINT16_ARRAY = 17, BHND_NVRAM_TYPE_UINT32_ARRAY = 18, BHND_NVRAM_TYPE_UINT64_ARRAY = 19, BHND_NVRAM_TYPE_INT8_ARRAY = 20, BHND_NVRAM_TYPE_INT16_ARRAY = 21, BHND_NVRAM_TYPE_INT32_ARRAY = 22, BHND_NVRAM_TYPE_INT64_ARRAY = 23, BHND_NVRAM_TYPE_CHAR_ARRAY = 24, BHND_NVRAM_TYPE_STRING_ARRAY = 25, BHND_NVRAM_TYPE_BOOL_ARRAY = 26 } bhnd_nvram_type;
int
bhnd_decode_port_rid
(device_t
dev, int type, int rid,
bhnd_port_type *port_type, u_int
*port, u_int *region);
u_int
bhnd_get_port_count
(device_t
dev, bhnd_port_type type);
int
bhnd_get_port_rid
(device_t dev,
bhnd_port_type type, u_int port,
u_int region);
int
bhnd_get_region_addr
(device_t
dev, bhnd_port_type port_type,
u_int port, u_int region,
bhnd_addr_t *region_addr, bhnd_size_t
*region_size);
u_int
bhnd_get_region_count
(device_t
dev, bhnd_port_type type, u_int
port);
bool
bhnd_is_region_valid
(device_t
dev, bhnd_port_type type, u_int
port, u_int region);
typedef enum { BHND_PORT_DEVICE = 0, BHND_PORT_BRIDGE = 1, BHND_PORT_AGENT = 2 } bhnd_port_type;
int
bhnd_alloc_pmu
(device_t
dev);
int
bhnd_release_pmu
(device_t
dev);
int
bhnd_enable_clocks
(device_t dev,
uint32_t clocks);
int
bhnd_request_clock
(device_t dev,
bhnd_clock clock);
int
bhnd_get_clock_freq
(device_t
dev, bhnd_clock clock, u_int
*freq);
int
bhnd_get_clock_latency
(device_t
dev, bhnd_clock clock, u_int
*latency);
int
bhnd_request_ext_rsrc
(device_t
dev, u_int rsrc);
int
bhnd_release_ext_rsrc
(device_t
dev, u_int rsrc);
typedef enum { BHND_CLOCK_DYN = (1 << 0), BHND_CLOCK_ILP = (1 << 1), BHND_CLOCK_ALP = (1 << 2), BHND_CLOCK_HT = (1 << 3) } bhnd_clock;
int
bhnd_register_provider
(device_t
dev, bhnd_service_t service);
int
bhnd_deregister_provider
(device_t
dev, bhnd_service_t service);
device_t
bhnd_retain_provider
(device_t
dev, bhnd_service_t service);
void
bhnd_release_provider
(device_t
dev, device_t provider,
bhnd_service_t service);
typedef enum { BHND_SERVICE_CHIPC, BHND_SERVICE_PWRCTL, BHND_SERVICE_PMU, BHND_SERVICE_NVRAM, BHND_SERVICE_GPIO, BHND_SERVICE_ANY = 1000 } bhnd_service_t;
bhnd_erom_class_t *
bhnd_driver_get_erom_class
(driver_t
*driver);
bhnd_devclass_t
bhnd_find_core_class
(uint16_t
vendor, uint16_t device);
const char *
bhnd_find_core_name
(uint16_t
vendor, uint16_t device);
bhnd_devclass_t
bhnd_core_class
(const struct
bhnd_core_info *ci);
const char *
bhnd_core_name
(const struct
bhnd_core_info *ci);
int
bhnd_format_chip_id
(char
*buffer, size_t size, uint16_t
chip_id);
void
bhnd_set_custom_core_desc
(device_t
dev, const char *dev_name);
void
bhnd_set_default_core_desc
(device_t
dev);
const char *
bhnd_vendor_name
(uint16_t
vendor);
#define BHND_CHIPID_MAX_NAMELEN 32
bhnd
provides a unified bus and driver
programming interface for the on-chip interconnects and IP cores found in
Broadcom Home Networking Division (BHND) devices.
The BHND device family consists of MIPS/ARM SoCs (System On a Chip) and host-connected chipsets based on a common library of Broadcom IP cores, connected via one of two on-chip backplane (hardware bus) architectures.
Hardware designed prior to 2009 used Broadcom's “SSB” backplane architecture, based on Sonics Silicon's interconnect IP. Each core on the Sonics backplane vends a 4 KiB register block, containing both device-specific CSRs, and SSB-specific per-core device management (enable/reset/etc) registers.
Subsequent hardware is based on Broadcom's “BCMA” backplane, based on ARM's AMBA IP. The IP cores used in earlier SSB-based devices were adapted for compatibility with the new backplane, with additional “wrapper” cores providing per-core device management functions in place of the SSB per-core management registers.
When BHND hardware is used as a host-connected peripheral (e.g., in a PCI Wi-Fi card), the on-chip peripheral controller core is configured to operate as an endpoint device, bridging access to the SoC hardware:
The bhnd
driver programming interface
— and bhndb(4) host bridge drivers — support
the implementation of common drivers for Broadcom IP cores, whether attached
via a BHND host bridge, or via the native SoC backplane.
The bhnd_resource functions are wrappers for the standard struct resource bus APIs, providing support for SYS_RES_MEMORY resources that, on bhndb(4) bridged chipsets, may require on-demand remapping of address windows prior to accessing bus memory.
These functions are primarily used in the implementation of BHND platform device drivers that, on host-connected peripherals, must share a small set of register windows during initial setup and teardown.
BHND peripherals are designed to not require register window remapping during normal operation, and most drivers may safely use the standard struct resource APIs directly.
The
bhnd_activate_resource
()
function activates a previously allocated resource.
The arguments are as follows:
bhnd_alloc_resource
().The
bhnd_alloc_resource
()
function allocates a resource from a device's parent
bhnd(4) bus.
The arguments are as follows:
To request that the bus supply the resource's default start, end, and count values, pass start and end values of 0ul and ~0ul respectively, and a count of 1.
The
bhnd_alloc_resource_any
()
function is a convenience wrapper for
bhnd_alloc_resource
(), using the resource's default
start, end, and
count values.
The arguments are as follows:
The
bhnd_alloc_resources
()
function allocates resources defined in resource specification from a
device's parent bhnd(4) bus.
The arguments are as follows:
The
bhnd_deactivate_resource
()
function deactivates a resource previously activated by.
bhnd_activate_resource
(). The arguments are as
follows:
The
bhnd_release_resource
()
function frees a resource previously returned by
bhnd_alloc_resource
(). The arguments are as
follows:
The
bhnd_release_resources
()
function frees resources previously returned by
bhnd_alloc_resources
(). The arguments are as
follows:
bhnd_alloc_resources
().The bhnd_resource structure contains the following fields:
The bhnd_bus_space functions wrap their equivalent bus_space(9) counterparts, and provide support for accessing bus memory via struct bhnd_resource.
bhnd_bus_barrier
()bhnd_bus_[read|write]_[1|2|4]
()bhnd_bus_[read_multi|write_multi]_[1|2|4]
()bhnd_bus_[read_multi_stream|write_multi_stream]_[1|2|4]
()bhnd_bus_[read_region|write_region]_[1|2|4]
()bhnd_bus_[read_region_stream|write_region_stream]_[1|2|4]
()bhnd_bus_[read_stream|write_stream]_[1|2|4]
()bhnd_bus_[set_multi|set_stream]_[1|2|4]
()Drivers that do not rely on struct bhnd_resource should use the standard struct resource and bus_space(9) APIs directly.
The
bhnd_read_ioctl
()
function is used to read the I/O control register value of device
dev, returning the current value in
ioctl.
The
bhnd_write_ioctl
()
function is used to modify the I/O control register of
dev. The new value of the register is computed by
updating any bits set in mask to
value. The following I/O control flags are
supported:
BHND_IOCTL_BIST
BHND_IOCTL_PME
BHND_IOCTL_CLK_FORCE
BHND_IOCTL_CLK_EN
BHND_IOCTL_CFLAGS
The
bhnd_read_iost
()
function is used to read the I/O status register of device
dev, returning the current value in
iost. The following I/O status flags are
supported:
BHND_IOST_BIST_DONE
BHND_IOCTL_BIST
flag of the I/O control register
is cleared using bhnd_write_ioctl
().BHND_IOST_BIST_FAIL
BHND_IOST_BIST_DONE
is not also
set.BHND_IOST_CLK
BHND_IOST_DMA64
BHND_IOST_CFLAGS
The
bhnd_read_config
()
function is used to read a data item of width bytes at
offset from the backplane-specific agent/config space
of the device dev.
The
bhnd_write_config
()
function is used to write a data item of width bytes
with value at offset from the
backplane-specific agent/config space of the device
dev. The requested width must be
one of 1, 2, or 4 bytes.
The agent/config space accessible via
bhnd_read_config
()
and bhnd_write_config
() is backplane-specific, and
these functions should only be used for functionality that is not available
via another bhnd
function.
The
bhnd_suspend_hw
()
function transitions the device dev to a low power
“RESET” state, writing ioctl to the I/O
control flags of dev. The hardware may be brought out
of this state using bhnd_reset_hw
().
The
bhnd_reset_hw
()
function first transitions the device dev to a low
power RESET state, writing ioctl_reset to the I/O
control flags of dev, and then brings the device out
of RESET, writing ioctl to the device's I/O control
flags.
The
bhnd_is_hw_suspended
()
function returns true
if the device
dev is currently held in a RESET state, or is
otherwise not clocked. Otherwise, it returns
false
.
Any outstanding per-device PMU requests
made using
bhnd_enable_clocks
(),
bhnd_request_clock
(), or
bhnd_request_ext_rsrc
() will be released
automatically upon placing a device into a RESET state.
The
bhnd_get_attach_type
()
function returns the attachment type of the parent bhnd(4)
bus of device dev.
The following attachment types are supported:
BHND_ATTACH_ADAPTER
BHND_ATTACH_NATIVE
The
bhnd_get_chipid
()
function returns chip information from the parent bhnd(4)
bus of device dev. The returned
bhnd_chipid struct contains the following fields:
Several different physical semiconductor package variants may exist for a given chip, each of which may require driver workarounds for hardware errata, unpopulated components, etc.
bhnd
capability flags supported by this
chip.The following constants are defined for known chip_type values:
BHND_CHIPTYPE_SIBA
BHND_CHIPTYPE_BCMA
BHND_CHIPTYPE_BCMA_ALT
BHND_CHIPTYPE_UBUS
The following chip_caps flags are supported:
BHND_CAP_BP64
BHND_CAP_PMU
Additional symbolic constants for known
chip_id, chip_pkg, and
chip_type values are defined in
<dev/bhnd/bhnd_ids.h>
.
The
bhnd_get_class
()
function returns the BHND class of device dev, if the
device's
vendor
and
device
identifiers are recognized. Otherwise, returns
BHND_DEVCLASS_OTHER
.
One of the following device classes will be returned:
BHND_DEVCLASS_CC
BHND_DEVCLASS_CC_B
BHND_DEVCLASS_PMU
BHND_DEVCLASS_PCI
BHND_DEVCLASS_PCIE
BHND_DEVCLASS_PCCARD
BHND_DEVCLASS_RAM
BHND_DEVCLASS_MEMC
BHND_DEVCLASS_ENET
BHND_DEVCLASS_ENET_MAC
BHND_DEVCLASS_ENET_PHY
BHND_DEVCLASS_WLAN
BHND_DEVCLASS_WLAN_MAC
BHND_DEVCLASS_WLAN_PHY
BHND_DEVCLASS_CPU
BHND_DEVCLASS_SOC_ROUTER
BHND_DEVCLASS_SOC_BRIDGE
BHND_DEVCLASS_EROM
BHND_DEVCLASS_NVRAM
BHND_DEVCLASS_SOFTMODEM
BHND_DEVCLASS_USB_HOST
BHND_DEVCLASS_USB_DEV
BHND_DEVCLASS_USB_DUAL
BHND_DEVCLASS_OTHER
BHND_DEVCLASS_INVALID
The
bhnd_get_core_info
()
function returns the core information for device dev.
The returned bhnd_core_info structure contains the
following fields:
Symbolic constants for common vendor and device identifiers are
defined in
<dev/bhnd/bhnd_ids.h>
.
Common vendor identifiers include:
BHND_MFGID_ARM
BHND_MFGID_BCM
BHND_MFGID_MIPS
The
bhnd_get_core_index
(),
bhnd_get_core_unit
(),
bhnd_get_device
(),
bhnd_get_hwrev
(),
and
bhnd_get_vendor
()
functions are convenience wrappers for
bhnd_get_core_info
(), returning, respect the
core_idx, core_unit,
device, hwrev, or
vendor field from the
bhnd_core_info structure.
The
bhnd_get_device_name
()
function returns a human readable name for device
dev.
The
bhnd_get_vendor_name
()
function returns a human readable name for the vendor of device
dev.
The
bhnd_read_board_info
()
function attempts to read the board information for device
dev. The board information will be returned in the
location pointed to by info on success.
The bhnd_board_info structure contains the following fields:
The board_devid field is the Broadcom PCI device ID that most closely matches the capabilities of the BHND device (if any).
On PCI devices, the board_vendor, board_type, and board_devid fields default to the PCI Subsystem Vendor ID, PCI Subsystem ID, and PCI device ID, unless overridden in device NVRAM.
On other devices, including SoCs, the board_vendor, board_type, and board_devid fields will be populated from device NVRAM.
Symbolic constants for common board flags are defined in
<dev/bhnd/bhnd_ids.h>
.
The bhnd device matching functions are used to match against core, chip, and board-level device attributes. Match requirements are specified using the struct bhnd_board_match, struct bhnd_chip_match, struct bhnd_core_match, struct bhnd_device_match, and struct bhnd_hwrev_match match descriptor structures.
The
bhnd_board_matches
()
function returns true
if board
matches the board match descriptor desc. Otherwise, it
returns false
.
The
bhnd_chip_matches
()
function returns true
if chip
matches the chip match descriptor desc. Otherwise, it
returns false
.
The
bhnd_core_matches
()
function returns true
if core
matches the core match descriptor desc. Otherwise, it
returns false
.
The
bhnd_device_matches
()
function returns true
if the device
dev matches the device match descriptor
desc. Otherwise, it returns
false
.
The
bhnd_hwrev_matches
()
function returns true
if hwrev
matches the hwrev match descriptor desc. Otherwise, it
returns false
.
The
bhnd_bus_match_child
()
function returns the first child device of bus that
matches the device match descriptor desc. If no
matching child is found, NULL
is returned.
The
bhnd_core_get_match_desc
()
function returns an equality match descriptor for the core info in
core. The returned descriptor will match only on core
attributes identical to those defined by core.
The
bhnd_cores_equal
()
function is a convenience wrapper for
bhnd_core_matches
() and
bhnd_core_get_match_desc
(). This function returns
true
if the bhnd_core_info
structures lhs and rhs are
equal. Otherwise, it returns false
.
The
bhnd_match_core
()
function returns a pointer to the first entry in the array
cores of length num_cores that
matches desc. If no matching core is found,
NULL
is returned.
A bhnd_board_match match descriptor may be initialized using one or more of the following macros:
BHND_MATCH_BOARD_VENDOR
(vendor)BHND_MATCH_BOARD_TYPE
(type)BHND_BOARD_
##
typeBHND_MATCH_SROMREV
(sromrev)BHND_HWREV_
##
sromrev.BHND_MATCH_BOARD_REV
(hwrev)BHND_
##
hwrev.BHND_MATCH_BOARD
(vendor,
type)BHND_MATCH_BOARD_VENDOR
() and
BHND_MATCH_BOARD_TYPE
().For example:
struct bhnd_board_match board_desc = { BHND_MATCH_BOARD_VENDOR(BHND_MFGID_BROADCOM), BHND_MATCH_BOARD_TYPE(BCM94360X52C), BHND_MATCH_BOARD_REV(HWREV_ANY), BHND_MATCH_SROMREV(RANGE(0, 10)) };
A bhnd_chip_match match descriptor may be initialized using one or more of the following macros:
BHND_MATCH_CHIP_ID
(id)BHND_CHIPID_ ##
idBHND_MATCH_CHIP_REV
(hwrev)BHND_
##
hwrev.BHND_MATCH_CHIP_PKG
(pkg)BHND_PKGID_
##
pkgBHND_MATCH_CHIP_TYPE
(type)BHND_CHIPTYPE_
##
typeBHND_MATCH_CHIP_IP
(id,
pkg)BHND_MATCH_CHIP_ID
() and
BHND_MATCH_CHIP_PKG
().BHND_MATCH_CHIP_IPR
(id,
pkg, hwrev)BHND_MATCH_CHIP_ID
(),
BHND_MATCH_CHIP_PKG
(), and
BHND_MATCH_CHIP_REV
().BHND_MATCH_CHIP_IR
(id,
hwrev)BHND_MATCH_CHIP_ID
() and
BHND_MATCH_CHIP_REV
().For example:
struct bhnd_chip_match chip_desc = { BHND_MATCH_CHIP_IP(BCM4329, BCM4329_289PIN), BHND_MATCH_CHIP_TYPE(SIBA) };
A bhnd_core_match match descriptor may be initialized using one or more of the following macros:
BHND_MATCH_CORE_VENDOR
(vendor)BHND_MATCH_CORE_ID
(id)BHND_MATCH_CORE_REV
(hwrev)BHND_
##
hwrev.BHND_MATCH_CORE_CLASS
(class)BHND_MATCH_CORE_IDX
(idx)BHND_MATCH_CORE_UNIT
(unit)BHND_MATCH_CORE
(vendor,
id)BHND_MATCH_CORE_VENDOR
()
and BHND_MATCH_CORE_ID
().For example:
struct bhnd_core_match core_desc = { BHND_MATCH_CORE(BHND_MFGID_BROADCOM, BHND_COREID_CC), BHND_MATCH_CORE_REV(HWREV_RANGE(0, 10)) };
The bhnd_device_match match descriptor supports matching on all board, chip, and core attributes, and may be initialized using any of the bhnd_board_match, bhnd_chip_match, or bhnd_core_match macros.
For example:
struct bhnd_device_match device_desc = { BHND_MATCH_CHIP_IP(BCM4329, BCM4329_289PIN), BHND_MATCH_BOARD_VENDOR(BHND_MFGID_BROADCOM), BHND_MATCH_BOARD_TYPE(BCM94329AGB), BHND_MATCH_CORE(BHND_MFGID_BROADCOM, BHND_COREID_CC), };
A bhnd_hwrev_match match descriptor may be initialized using one of the following macros:
BHND_HWREV_ANY
BHND_HWREV_EQ
(hwrev)BHND_HWREV_GTE
(hwrev)BHND_HWREV_LTE
(hwrev)BHND_HWREV_RANGE
(start,
end)BHND_HWREV_INVALID
is specified as the
end value, will match on any revision equal to or
greater than startThe bhnd device table functions are used to query device and quirk tables.
The
bhnd_device_lookup
()
function returns a pointer to the first entry in device table
table that matches the device
dev. The table entry size is specified by
entry_size.
The
bhnd_device_quirks
()
function scan the device table table for all quirk
entries that match the device dev, returning the
bitwise OR of all matching quirk flags. The table entry size is specified by
entry_size.
The bhnd_device structure contains the following fields:
NULL
.NULL
.The following device flags are supported:
BHND_DF_ANY
BHND_DF_HOSTB
BHND_DF_ADAPTER
.BHND_DF_SOC
BHND_DF_ADAPTER
A bhnd_device table entry may be initialized using one of the following macros:
BHND_DEVICE
(vendor,
device, desc,
quirks, flags)BHND_MFGID_
##
vendor and a core device ID equal to
BHND_COREID_ ##
device.
The device's verbose description is specified by the
desc argument, a pointer to the device-specific
quirks table is specified by the quirks argument,
and any required device flags may be provided in
flags. The optional flags
argument defaults to BHND_DF_ANY
if omitted.
BHND_DEVICE_END
For example:
struct bhnd_device bhnd_usb11_devices[] = { BHND_DEVICE(BCM, USB, "Broadcom USB1.1 Controller", bhnd_usb11_quirks), BHND_DEVICE_END };
The bhnd_device_quirk structure contains the following fields:
A bhnd_device_quirk table entry may be initialized using one of the following convenience macros:
BHND_BOARD_QUIRK
(board,
flags)BHND_BOARD_ ##
board.BHND_CHIP_QUIRK
(chip,
hwrev, flags)BHND_CHIPID_BCM ##
chip and chip hardware revision that matches
BHND_ ##
hwrev.BHND_PKG_QUIRK
(chip,
pkg, flags")BHND_CHIPID_BCM ##
chip and chip package equal to
BHND_ ## chip ##
pkg.BHND_CORE_QUIRK
(hwrev,
flags")BHND_ ##
hwrev.struct bhnd_device_quirk bhnd_usb11_quirks[] = { BHND_DEVICE(BCM, USB, "Broadcom USB1.1 Controller", bhnd_usb11_quirks), BHND_DEVICE_END };
The
bhnd_get_dma_translation
()
function is used to request a DMA address translation descriptor suitable
for use with a maximum DMA address width of width,
with support for the requested translation flags.
If a suitable DMA address translation descriptor is found, it will
be stored in translation, and a bus DMA tag specifying
the DMA translation's address restrictions will be stored in
dmat. The translation and
dmat arguments may be NULL
if
the translation descriptor or DMA tag are not desired.
The following DMA translation flags are supported:
BHND_DMA_TRANSLATION_PHYSMAP
This is used in conjunction with
BHND_DMA_TRANSLATION_BYTESWAPPED
to define a DMA
translation that provides byteswapped access to physical memory on
big-endian MIPS SoCs.
BHND_DMA_TRANSLATION_BYTESWAPPED
This is primarily used to perform efficient byte swapping of DMA data on embedded MIPS SoCs executing in big-endian mode.
The following symbolic constants are defined for common DMA address widths:
BHND_DMA_ADDR_30BIT
BHND_DMA_ADDR_32BIT
BHND_DMA_ADDR_64BIT
The bhnd_dma_translation structure contains the following fields:
Support for DMA extended address changes — including coordination with the core providing device-to-host DMA address translation — is handled transparently by the DMA engine.
For example, on PCI Wi-Fi devices, the Wi-Fi core's DMA engine
will (in effect) update the PCI host bridge core's DMA
sbtopcitranslation
base address to map the
target address prior to performing a DMA transaction.
The
bhnd_get_intr_count
()
function is used to determine the number of backplane interrupt lines
assigned to the device dev. Interrupt line identifiers
are allocated in monotonically increasing order, starting with 0.
The
bhnd_get_intr_ivec
()
function is used to determine the backplane interrupt vector assigned to
interrupt line intr on the device
dev, writing the result to ivec.
Interrupt vector assignments are backplane-specific: On BCMA devices, this
function returns the OOB bus line assigned to the interrupt. On SIBA
devices, it returns the target OCP slave flag number assigned to the
interrupt.
The
bhnd_map_intr
()
function is used to map interrupt line intr assigned
to device dev to an IRQ number, writing the result to
irq. Until unmapped, this IRQ may be used when
allocating a resource of type SYS_RES_IRQ.
Ownership of the interrupt mapping is assumed by the caller, and must be explicitly released using bhnd_unmap_intr.
The
bhnd_unmap_intr
()
function is used to unmap bus IRQ irq previously
mapped using bhnd_map_intr
() by the device
dev.
The bhnd_nvram_getvar
() function is used
to read the value of NVRAM variable name from the
NVRAM provider(s) registered with the parent bhnd(4) bus
of device dev, coerced to the desired data
representation type, written to the buffer specified
by buf.
Before the call, the maximum capacity of
buf is specified by len. After a
successful call — or if ENOMEM
is returned
— the size of the available data will be written to
len. The size of the desired data representation can
be determined by calling
bhnd_nvram_getvar
()
with a NULL
argument for
buf.
The following NVRAM data types are supported:
BHND_NVRAM_TYPE_UINT8
BHND_NVRAM_TYPE_UINT16
BHND_NVRAM_TYPE_UINT32
BHND_NVRAM_TYPE_UINT64
BHND_NVRAM_TYPE_INT8
BHND_NVRAM_TYPE_INT16
BHND_NVRAM_TYPE_INT32
BHND_NVRAM_TYPE_INT64
BHND_NVRAM_TYPE_CHAR
BHND_NVRAM_TYPE_STRING
BHND_NVRAM_TYPE_BOOL
BHND_NVRAM_TYPE_NULL
BHND_NVRAM_TYPE_DATA
BHND_NVRAM_TYPE_UINT8_ARRAY
BHND_NVRAM_TYPE_UINT16_ARRAY
BHND_NVRAM_TYPE_UINT32_ARRAY
BHND_NVRAM_TYPE_UINT64_ARRAY
BHND_NVRAM_TYPE_INT8_ARRAY
BHND_NVRAM_TYPE_INT16_ARRAY
BHND_NVRAM_TYPE_INT32_ARRAY
BHND_NVRAM_TYPE_INT64_ARRAY
BHND_NVRAM_TYPE_CHAR_ARRAY
BHND_NVRAM_TYPE_STRING_ARRAY
BHND_NVRAM_TYPE_BOOL_ARRAY
The
bhnd_nvram_getvar_array
(),
bhnd_nvram_getvar_int
(),
bhnd_nvram_getvar_int8
(),
bhnd_nvram_getvar_int16
(),
bhnd_nvram_getvar_int32
(),
bhnd_nvram_getvar_uint
(),
bhnd_nvram_getvar_uint8
(),
bhnd_nvram_getvar_uint16
(),
bhnd_nvram_getvar_uint32
(), and
bhnd_nvram_getvar_str
() functions are convenience
wrappers for bhnd_nvram_getvar
().
The
bhnd_nvram_getvar_array
()
function returns either a value of exactly size in
buf, or returns an error code of
ENXIO
if the data representation is not exactly
size in length.
The
bhnd_nvram_getvar_int
()
and
bhnd_nvram_getvar_uint
()
functions return the value of NVRAM variable name,
coerced to a signed or unsigned integer type of width
(1, 2, or 4 bytes).
The
bhnd_nvram_getvar_int8
(),
bhnd_nvram_getvar_int16
(),
bhnd_nvram_getvar_int32
(),
bhnd_nvram_getvar_uint
(),
bhnd_nvram_getvar_uint8
(),
bhnd_nvram_getvar_uint16
(),
and
bhnd_nvram_getvar_uint32
()
functions return the value of NVRAM variable name,
coerced to a signed or unsigned 8, 16, or 32-bit integer type.
The
bhnd_nvram_getvar_str
()
functions return the value of NVRAM variable name,
coerced to a NUL-terminated string.
The
bhnd_nvram_string_array_next
()
function iterates over all strings in the inp
BHND_NVRAM_TYPE_STRING_ARRAY
value. The size of
inp, including any terminating NUL character(s), is
specified using the ilen argument. The
prev argument should be either a string pointer
previously returned by
bhnd_nvram_string_array_next
(), or
NULL
to begin iteration. If prev is
not NULL
, the olen
argument must be a pointer to the length previously returned by
bhnd_nvram_string_array_next
(). On success, the next
string element's length will be written to this pointer.
Per-device interconnect memory mappings are identified by a combination of port type, port number, and region number. Port and memory region identifiers are allocated in monotonically increasing order for each port type, starting with 0.
The following port types are supported:
BHND_PORT_DEVICE
SYS_RES_MEMORY
resource ID of 0.BHND_PORT_BRIDGE
BHND_PORT_AGENT
The
bhnd_decode_port_rid
()
function is used to decode the resource ID rid
assigned to device dev, of resource type
type, writing the port type to
port_type, port number to port,
and region number to region.
The
bhnd_get_port_count
()
function returns the number of ports of type type
assigned to device dev.
The
bhnd_get_port_rid
()
function returns the resource ID for the
SYS_RES_MEMORY
resource mapping the
port of type and
region on device dev, or -1 if
the port or region are invalid, or do not have an assigned resource ID.
The
bhnd_get_region_addr
()
function is used to determine the base address and size of the memory
region on port of
type assigned to dev. The
region's base device address will be written to
region_addr, and the region size to
region_size.
The
bhnd_get_region_count
()
function returns the number of memory regions mapped to
port of type on device
dev.
The
bhnd_is_region_valid
()
function returns true
if
region is a valid region mapped by
port of type on device
dev.
Drivers must ask the parent bhnd(4) bus to
allocate device PMU state using bhnd_alloc_pmu
()
before calling any another bhnd PMU functions.
The
bhnd_alloc_pmu
()
function is used to allocate per-device PMU state and enable PMU request
handling for device dev. The memory region containing
the device's PMU register block must be allocated using
bus_alloc_resource(9) or
bhnd_alloc_resource
() before calling
bhnd_alloc_pmu
(), and must not be released until
after calling bhnd_release_pmu
().
On all supported BHND hardware, the PMU register block is mapped by the device's control/status registers in the first device port and region.
The
bhnd_release_pmu
()
function releases the per-device PMU state previously allocated for device
dev using bhnd_alloc_pmu
().
Any outstanding clock and external resource requests will be discarded upon
release of the device PMU state.
The
bhnd_enable_clocks
()
function is used to request that clocks be powered up
and routed to the backplane on behalf of device dev.
This will power any clock sources required (e.g., XTAL, PLL, etc) and wait
until the requested clocks are stable. If the request succeeds, any previous
clock requests issued by dev will be discarded.
The following clocks are supported, and may be combined using bitwise OR to request multiple clocks:
The
bhnd_request_clock
()
function is used to request that clock (or faster) be
powered up and routed to device dev.
The
bhnd_get_clock_freq
()
function is used to request the current clock frequency of
clock, writing the frequency in Hz to
freq.
The
bhnd_get_clock_latency
()
function is used to determine the transition latency required for
clock, writing the latency in microseconds to
latency. The BHND_CLOCK_HT
latency value is suitable for use as the D11 Wi-Fi core
fastpwrup_dly
value.
The
bhnd_request_ext_rsrc
()
function is used to request that the external PMU-managed resource assigned
to device dev, identified by device-specific
identifier rsrc, be powered up.
The
bhnd_release_ext_rsrc
()
function releases any outstanding requests by device
dev for the PMU-managed resource identified by
device-specific identifier rsrc. If an external
resource is shared by multiple devices, it will not be powered down until
all device requests are released.
The
bhnd_register_provider
()
function is used to register device dev as a provider
for platform service with the parent
bhnd(4) bus.
The following service types are supported:
BHND_SERVICE_CHIPC
BHND_SERVICE_PWRCTL
BHND_SERVICE_PMU
BHND_SERVICE_NVRAM
BHND_SERVICE_GPIO
BHND_SERVICE_ANY
bhnd_deregister_provider
()
to remove all service provider registrations for a device.The
bhnd_deregister_provider
()
function attempts to remove provider registration for the device
dev and service. If a
service argument of
BHND_SERVICE_ANY
is specified, this function will
attempt to remove
all service provider
registrations for dev.
The
bhnd_retain_provider
()
function retains and returns a reference to the provider registered for
service with the parent bhnd(4) bus
of devce dev, if available. On success, the caller is
responsible for releasing this provider reference using
bhnd_release_provider
(). The service provider is
guaranteed to remain available until the provider reference is released.
The
bhnd_release_provider
()
function releases a reference to a provider for
service, previously retained by device
dev using
bhnd_retain_provider
().
The
bhnd_driver_get_erom_class
()
function returns the bhnd_erom(9) class for the device
enumeration table format used by bhnd(4) bus driver
instance driver. If the driver does not support
bhnd_erom(9) device enumeration,
NULL
is returned.
The
bhnd_find_core_class
()
function looks up the BHND class, if known, for the BHND vendor ID
vendor and device ID device.
The
bhnd_find_core_name
()
function is used to fetch the human-readable name, if known, for the BHND
core with a vendor ID of vendor and device ID of
device.
The
bhnd_core_class
()
and
bhnd_core_name
()
functions are convenience wrappers for
bhnd_find_core_class
() and
bhnd_find_core_name
(), that use the
vendor and device fields of the
core info structure ci.
The
bhnd_format_chip_id
()
function writes a NUL-terminated human-readable representation of the BHND
chip_id value to the specified
buffer with a capacity of size.
No more than size-1 characters will be written, with
the size'th character set to '\0'. A buffer size of
BHND_CHIPID_MAX_NAMELEN
is sufficient for any string
representation produced using
bhnd_format_chip_id
().
The
bhnd_set_custom_core_desc
()
function uses the bhnd(4) device identification of
dev, overriding the core name with the specified
dev_name, to populate the device's verbose description
using device_set_desc.
The
bhnd_set_default_core_desc
()
function uses the bhnd(4) device identification of
dev to populate the device's verbose description using
device_set_desc.
The
bhnd_vendor_name
()
function returns the human-readable name for the JEP-106, ARM 4-bit
continuation encoded manufacturer ID vendor, if
known.
The bhnd_activate_resource
(),
bhnd_alloc_resources
(),
bhnd_deactivate_resource
(), and
bhnd_release_resource
() functions return 0 on
success, otherwise an appropriate error code is returned.
The bhnd_alloc_resource
() and
bhnd_alloc_resource_any
() functions return a pointer
to struct resource on success, a null pointer
otherwise.
The bhnd_read_config
() and
bhnd_write_config
() functions return 0 on success,
or one of the following values on error:
EINVAL
]EINVAL
]ENODEV
]EFAULT
]The bhnd_read_ioctl
(),
bhnd_write_ioctl
(),
bhnd_read_iost
(),
bhnd_reset_hw
(), and
bhnd_suspend_hw
() functions return 0 on success,
otherwise an appropriate error code is returned.
The bhnd_read_board_info
() function
returns 0 on success, otherwise an appropriate error code is returned.
The bhnd_get_dma_translation
() function
returns 0 on success, or one of the following values on error:
ENODEV
]ENOENT
]If fetching the requested DMA address translation otherwise fails, an appropriate error code will be returned.
The bhnd_get_intr_ivec
() function returns
0 on success, or ENXIO
if the requested interrupt
line exceeds the number of interrupt lines assigned to the device.
The bhnd_map_intr
() function returns 0 on
success, otherwise an appropriate error code is returned.
The bhnd_nvram_getvar
(),
bhnd_nvram_getvar_array
(),
bhnd_nvram_getvar_int
(),
bhnd_nvram_getvar_int8
(),
bhnd_nvram_getvar_int16
(),
bhnd_nvram_getvar_int32
(),
bhnd_nvram_getvar_uint
(),
bhnd_nvram_getvar_uint8
(),
bhnd_nvram_getvar_uint16
(), and
bhnd_nvram_getvar_uint32
() functions return 0 on
success, or one of the following values on error:
ENODEV
]ENOENT
]ENOMEM
]EOPNOTSUPP
]ERANGE
]If reading the variable otherwise fails, an appropriate error code will be returned.
The bhnd_decode_port_rid
() function
returns 0 on success, or an appropriate error code if no matching
port/region is found.
The bhnd_get_port_rid
() function returns
the resource ID for the requested port and region, or -1 if the port or
region are invalid, or do not have an assigned resource ID.
The bhnd_get_region_addr
() function
returns 0 on success, or an appropriate error code if no matching
port/region is found.
The bhnd_alloc_pmu
() function returns 0 on
success, otherwise an appropriate error code is returned.
The bhnd_release_pmu
() function returns 0
on success, otherwise an appropriate error code is returned, and the core
state will be left unmodified.
The bhnd_enable_clocks
() and
bhnd_request_clock
() functions return 0 on success,
or one of the following values on error:
ENODEV
]ENXIO
]The bhnd_get_clock_freq
() function returns
0 on success, or ENODEV
if the frequency for the
specified clock is not available.
The bhnd_get_clock_latency
() function
returns 0 on success, or ENODEV
if the transition
latency for the specified clock is not available.
The bhnd_request_ext_rsrc
() and
bhnd_release_ext_rsrc
() functions return 0 on
success, otherwise an appropriate error code is returned.
The bhnd_register_provider
() function
returns 0 on success, EEXIST
if an entry for service
already exists, or an appropriate error code if service registration
otherwise fails.
The bhnd_deregister_provider
() function
returns 0 on success, or EBUSY
if active references
to the service provider exist.
The bhnd_retain_provider
() function
returns a pointer to device_t on success, a null
pointer if the requested provider is not registered.
The bhnd_format_chip_id
() function returns
the total number of bytes written on success, or a negative integer on
failure.
The bhnd
driver programming interface and
this manual page were written by Landon Fuller
<landonf@FreeBSD.org>.
March 26, 2018 | Debian |