/linux/drivers/net/ethernet/sunplus/ |
H A D | spl2sw_desc.c | 16 struct spl2sw_mac_desc *rx_desc; in spl2sw_rx_descs_flush() local 20 rx_desc = comm->rx_desc[i]; in spl2sw_rx_descs_flush() 23 rx_desc[j].addr1 = rx_skbinfo[j].mapping; in spl2sw_rx_descs_flush() 24 rx_desc[j].cmd2 = (j == comm->rx_desc_num[i] - 1) ? in spl2sw_rx_descs_flush() 28 rx_desc[j].cmd1 = RXD_OWN; in spl2sw_rx_descs_flush() 63 struct spl2sw_mac_desc *rx_desc; in spl2sw_rx_descs_clean() local 70 rx_desc = comm->rx_desc[i]; in spl2sw_rx_descs_clean() 73 rx_desc[j].cmd1 = 0; in spl2sw_rx_descs_clean() 75 rx_desc[j].cmd2 = 0; in spl2sw_rx_descs_clean() 76 rx_desc[j].addr1 = 0; in spl2sw_rx_descs_clean() [all …]
|
/linux/drivers/net/wireless/ath/ath10k/ |
H A D | htt.c | 142 struct htt_rx_desc_v1 *rx_desc = container_of(rxd, in ath10k_qca99x0_rx_desc_get_l3_pad_bytes() local 146 return MS(__le32_to_cpu(rx_desc->msdu_end.qca99x0.info1), in ath10k_qca99x0_rx_desc_get_l3_pad_bytes() 152 struct htt_rx_desc_v1 *rx_desc = container_of(rxd, in ath10k_qca99x0_rx_desc_msdu_limit_error() local 156 return !!(rx_desc->msdu_end.common.info0 & in ath10k_qca99x0_rx_desc_msdu_limit_error() 193 struct htt_rx_desc_v2 *rx_desc = container_of(rxd, struct htt_rx_desc_v2, base); in ath10k_rx_desc_wcn3990_get_attention() local 195 return &rx_desc->attention; in ath10k_rx_desc_wcn3990_get_attention() 201 struct htt_rx_desc_v2 *rx_desc = container_of(rxd, struct htt_rx_desc_v2, base); in ath10k_rx_desc_wcn3990_get_frag_info() local 203 return &rx_desc->frag_info.common; in ath10k_rx_desc_wcn3990_get_frag_info() 209 struct htt_rx_desc_v2 *rx_desc = container_of(rxd, struct htt_rx_desc_v2, base); in ath10k_rx_desc_wcn3990_get_mpdu_start() local 211 return &rx_desc->mpdu_start; in ath10k_rx_desc_wcn3990_get_mpdu_start() [all …]
|
H A D | htt.h | 21 #include "rx_desc.h" 2079 * so all possible rx_desc structures must respect this assumption. 2146 /* rx_desc abstraction */ 2150 /* sizeof() of the rx_desc structure used by this hw */ 2153 /* offset of msdu_payload inside the rx_desc structure used by this hw */ 2164 * to the proper rx_desc structure 2201 /* The default implementation of all these getters is using the old rx_desc, 2204 * to switch the default implementation to the new rx_desc, since this would 2240 struct htt_rx_desc_v1 *rx_desc; in ath10k_htt_rx_desc_get_attention() local 2245 rx_desc = container_of(rxd, struct htt_rx_desc_v1, base); in ath10k_htt_rx_desc_get_attention() [all …]
|
/linux/drivers/net/ethernet/intel/ice/ |
H A D | ice_txrx_lib.c | 44 * @rx_desc: specific descriptor 48 static u32 ice_get_rx_hash(const union ice_32b_rx_flex_desc *rx_desc) in ice_get_rx_hash() argument 52 if (unlikely(rx_desc->wb.rxdid != ICE_RXDID_FLEX_NIC)) in ice_get_rx_hash() 55 nic_mdid = (struct ice_32b_rx_flex_desc_nic *)rx_desc; in ice_get_rx_hash() 62 * @rx_desc: specific descriptor 68 const union ice_32b_rx_flex_desc *rx_desc, in ice_rx_hash_to_skb() argument 78 hash = ice_get_rx_hash(rx_desc); in ice_rx_hash_to_skb() 86 * @rx_desc: receive descriptor 89 const union ice_32b_rx_flex_desc *rx_desc) in ice_rx_gcs() argument 94 desc = (struct ice_32b_rx_flex_desc_nic *)rx_desc; in ice_rx_gcs() [all …]
|
H A D | ice_txrx_lib.h | 27 * @rx_desc: Rx descriptor for current buffer 34 const union ice_32b_rx_flex_desc *rx_desc) in ice_is_non_eop() argument 38 if (likely(ice_test_staterr(rx_desc->wb.status_error0, ICE_RXD_EOF))) in ice_is_non_eop() 58 * @rx_desc: Rx 32b flex descriptor with RXDID=2 65 ice_get_vlan_tci(const union ice_32b_rx_flex_desc *rx_desc) in ice_get_vlan_tci() argument 70 if (ice_test_staterr(rx_desc->wb.status_error0, stat_err_bits)) in ice_get_vlan_tci() 71 return le16_to_cpu(rx_desc->wb.l2tag1); in ice_get_vlan_tci() 74 if (ice_test_staterr(rx_desc->wb.status_error1, stat_err_bits)) in ice_get_vlan_tci() 75 return le16_to_cpu(rx_desc->wb.l2tag2_2nd); in ice_get_vlan_tci() 119 union ice_32b_rx_flex_desc *rx_desc,
|
H A D | ice_xsk.c | 428 * @rx_desc: Pointer to Rx descriptors that will be filled 439 union ice_32b_rx_flex_desc *rx_desc, u16 count) in ice_fill_rx_descs() argument 448 rx_desc->read.pkt_addr = cpu_to_le64(dma); in ice_fill_rx_descs() 449 rx_desc->wb.status_error0 = 0; in ice_fill_rx_descs() 454 ice_xdp_meta_set_desc(*xdp, rx_desc); in ice_fill_rx_descs() 456 rx_desc++; in ice_fill_rx_descs() 479 union ice_32b_rx_flex_desc *rx_desc; in __ice_alloc_rx_bufs_zc() local 484 rx_desc = ICE_RX_DESC(rx_ring, ntu); in __ice_alloc_rx_bufs_zc() 488 nb_buffs_extra = ice_fill_rx_descs(xsk_pool, xdp, rx_desc, in __ice_alloc_rx_bufs_zc() 494 rx_desc = ICE_RX_DESC(rx_ring, 0); in __ice_alloc_rx_bufs_zc() [all …]
|
H A D | ice_virtchnl_fdir.h | 21 union ice_32b_rx_flex_desc rx_desc; member 50 union ice_32b_rx_flex_desc *rx_desc); 54 ice_vc_fdir_irq_handler(struct ice_vsi *ctrl_vsi, union ice_32b_rx_flex_desc *rx_desc) { } in ice_vc_fdir_irq_handler() argument
|
/linux/drivers/net/ethernet/intel/idpf/ |
H A D | idpf_singleq_txrx.c | 560 * @rx_desc: pointer to receive descriptor (in le64 format) 568 static bool idpf_rx_singleq_test_staterr(const union virtchnl2_rx_desc *rx_desc, in idpf_rx_singleq_test_staterr() argument 571 return !!(rx_desc->base_wb.qword1.status_error_ptype_len & in idpf_rx_singleq_test_staterr() 577 * @rx_desc: Rx descriptor for current buffer 579 static bool idpf_rx_singleq_is_non_eop(const union virtchnl2_rx_desc *rx_desc) in idpf_rx_singleq_is_non_eop() argument 582 if (likely(idpf_rx_singleq_test_staterr(rx_desc, IDPF_RXD_EOF_SINGLEQ))) in idpf_rx_singleq_is_non_eop() 658 * @rx_desc: the receive descriptor 666 idpf_rx_singleq_base_csum(const union virtchnl2_rx_desc *rx_desc) in idpf_rx_singleq_base_csum() argument 672 qword = le64_to_cpu(rx_desc->base_wb.qword1.status_error_ptype_len); in idpf_rx_singleq_base_csum() 693 * @rx_desc: the receive descriptor [all …]
|
H A D | idpf_txrx.c | 2982 * @rx_desc: Receive descriptor 2987 const struct virtchnl2_rx_flex_desc_adv_nic_3 *rx_desc, in idpf_rx_hash() argument 2995 hash = le16_to_cpu(rx_desc->hash1) | in idpf_rx_hash() 2996 (rx_desc->ff2_mirrid_hash2.hash2 << 16) | in idpf_rx_hash() 2997 (rx_desc->hash3 << 24); in idpf_rx_hash() 3059 * @rx_desc: receive descriptor 3064 idpf_rx_splitq_extract_csum_bits(const struct virtchnl2_rx_flex_desc_adv_nic_3 *rx_desc) in idpf_rx_splitq_extract_csum_bits() argument 3069 qword0 = rx_desc->status_err0_qw0; in idpf_rx_splitq_extract_csum_bits() 3070 qword1 = rx_desc->status_err0_qw1; in idpf_rx_splitq_extract_csum_bits() 3083 !le16_get_bits(rx_desc->ptype_err_fflags0, in idpf_rx_splitq_extract_csum_bits() [all …]
|
/linux/drivers/net/wireless/realtek/rtw88/ |
H A D | rx.c | 269 struct rtw_rx_desc *rx_desc = rx_desc8; in rtw_rx_query_rx_desc() local 276 pkt_stat->pkt_len = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_PKT_LEN); in rtw_rx_query_rx_desc() 277 pkt_stat->crc_err = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_CRC32); in rtw_rx_query_rx_desc() 278 pkt_stat->icv_err = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_ICV_ERR); in rtw_rx_query_rx_desc() 279 pkt_stat->drv_info_sz = le32_get_bits(rx_desc->w0, in rtw_rx_query_rx_desc() 281 enc_type = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_ENC_TYPE); in rtw_rx_query_rx_desc() 282 pkt_stat->shift = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SHIFT); in rtw_rx_query_rx_desc() 283 pkt_stat->phy_status = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_PHYST); in rtw_rx_query_rx_desc() 284 swdec = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SWDEC); in rtw_rx_query_rx_desc() 287 pkt_stat->cam_id = le32_get_bits(rx_desc->w1, RTW_RX_DESC_W1_MACID); in rtw_rx_query_rx_desc() [all …]
|
/linux/drivers/net/ethernet/intel/fm10k/ |
H A D | fm10k_main.c | 118 union fm10k_rx_desc *rx_desc; in fm10k_alloc_rx_buffers() local 126 rx_desc = FM10K_RX_DESC(rx_ring, i); in fm10k_alloc_rx_buffers() 137 rx_desc->q.pkt_addr = cpu_to_le64(bi->dma + bi->page_offset); in fm10k_alloc_rx_buffers() 139 rx_desc++; in fm10k_alloc_rx_buffers() 143 rx_desc = FM10K_RX_DESC(rx_ring, 0); in fm10k_alloc_rx_buffers() 149 rx_desc->d.staterr = 0; in fm10k_alloc_rx_buffers() 238 * @size: packet size from rx_desc 239 * @rx_desc: descriptor containing length of buffer written by hardware 252 union fm10k_rx_desc *rx_desc, in fm10k_add_rx_frag() argument 299 union fm10k_rx_desc *rx_desc, in fm10k_fetch_rx_buffer() argument [all …]
|
/linux/drivers/infiniband/ulp/isert/ |
H A D | ib_isert.c | 150 struct iser_rx_desc *rx_desc; in isert_alloc_rx_descriptors() local 161 rx_desc = isert_conn->rx_descs; in isert_alloc_rx_descriptors() 163 for (i = 0; i < ISERT_QP_MAX_RECV_DTOS; i++, rx_desc++) { in isert_alloc_rx_descriptors() 164 dma_addr = ib_dma_map_single(ib_dev, rx_desc->buf, in isert_alloc_rx_descriptors() 169 rx_desc->dma_addr = dma_addr; in isert_alloc_rx_descriptors() 171 rx_sg = &rx_desc->rx_sg; in isert_alloc_rx_descriptors() 172 rx_sg->addr = rx_desc->dma_addr + isert_get_hdr_offset(rx_desc); in isert_alloc_rx_descriptors() 175 rx_desc->rx_cqe.done = isert_recv_done; in isert_alloc_rx_descriptors() 181 rx_desc = isert_conn->rx_descs; in isert_alloc_rx_descriptors() 182 for (j = 0; j < i; j++, rx_desc++) { in isert_alloc_rx_descriptors() [all …]
|
/linux/drivers/net/wireless/ath/ath12k/ |
H A D | dp_rx.c | 198 struct hal_rx_desc *rx_desc) in ath12k_dp_rxdesc_get_ppduid() argument 200 return ab->hal_rx_ops->rx_desc_get_mpdu_ppdu_id(rx_desc); in ath12k_dp_rxdesc_get_ppduid() 204 struct hal_rx_desc *rx_desc) in ath12k_dp_rxdesc_mpdu_valid() argument 208 tlv_tag = ab->hal_rx_ops->rx_desc_get_mpdu_start_tag(rx_desc); in ath12k_dp_rxdesc_mpdu_valid() 266 struct ath12k_rx_desc_info *rx_desc; in ath12k_dp_list_cut_nodes() local 278 rx_desc = list_entry(cur, struct ath12k_rx_desc_info, list); in ath12k_dp_list_cut_nodes() 279 rx_desc->in_use = true; in ath12k_dp_list_cut_nodes() 293 struct ath12k_rx_desc_info *rx_desc, *safe; in ath12k_dp_rx_enqueue_free() local 296 list_for_each_entry_safe(rx_desc, safe, used_list, list) in ath12k_dp_rx_enqueue_free() 297 rx_desc->in_use = false; in ath12k_dp_rx_enqueue_free() [all …]
|
/linux/drivers/net/ethernet/intel/i40e/ |
H A D | i40e_xsk.c | 244 union i40e_rx_desc *rx_desc; in i40e_alloc_rx_buffers_zc() local 249 rx_desc = I40E_RX_DESC(rx_ring, ntu); in i40e_alloc_rx_buffers_zc() 260 rx_desc->read.pkt_addr = cpu_to_le64(dma); in i40e_alloc_rx_buffers_zc() 261 rx_desc->read.hdr_addr = 0; in i40e_alloc_rx_buffers_zc() 263 rx_desc++; in i40e_alloc_rx_buffers_zc() 269 rx_desc = I40E_RX_DESC(rx_ring, 0); in i40e_alloc_rx_buffers_zc() 274 rx_desc->wb.qword1.status_error_len = 0; in i40e_alloc_rx_buffers_zc() 346 union i40e_rx_desc *rx_desc, in i40e_handle_xdp_result_zc() argument 389 i40e_process_skb_fields(rx_ring, rx_desc, skb); in i40e_handle_xdp_result_zc() 427 union i40e_rx_desc *rx_desc; in i40e_clean_rx_irq_zc() local [all …]
|
/linux/drivers/net/wireless/ath/ath11k/ |
H A D | dp_rx.c | 255 struct hal_rx_desc *rx_desc) in ath11k_dp_rxdesc_get_80211hdr() argument 259 rx_pkt_hdr = ab->hw_params.hw_ops->rx_desc_get_msdu_payload(rx_desc); in ath11k_dp_rxdesc_get_80211hdr() 265 struct hal_rx_desc *rx_desc) in ath11k_dp_rxdesc_mpdu_valid() argument 269 tlv_tag = ab->hw_params.hw_ops->rx_desc_get_mpdu_start_tag(rx_desc); in ath11k_dp_rxdesc_mpdu_valid() 275 struct hal_rx_desc *rx_desc) in ath11k_dp_rxdesc_get_ppduid() argument 277 return ab->hw_params.hw_ops->rx_desc_get_mpdu_ppdu_id(rx_desc); in ath11k_dp_rxdesc_get_ppduid() 1794 ath11k_dp_rx_desc_end_tlv_copy(ab, rxcb->rx_desc, ldesc); in ath11k_dp_rx_msdu_coalesce() 1863 rx_attention = ath11k_dp_rx_get_attention(ar->ab, rxcb->rx_desc); in ath11k_dp_rx_h_csum_offload() 1995 if (ath11k_dp_rx_h_msdu_start_mesh_ctl_present(ar->ab, rxcb->rx_desc)) in ath11k_dp_rx_h_undecap_nwifi() 2099 hdr = (struct ieee80211_hdr *)ath11k_dp_rx_h_80211_hdr(ar->ab, rxcb->rx_desc); in ath11k_dp_rx_h_find_rfc1042() [all …]
|
/linux/drivers/spi/ |
H A D | spi-pxa2xx-dma.c | 139 struct dma_async_tx_descriptor *tx_desc, *rx_desc; in pxa2xx_spi_dma_prepare() local 149 rx_desc = pxa2xx_spi_dma_prepare_one(drv_data, DMA_DEV_TO_MEM, xfer); in pxa2xx_spi_dma_prepare() 150 if (!rx_desc) { in pxa2xx_spi_dma_prepare() 157 rx_desc->callback = pxa2xx_spi_dma_callback; in pxa2xx_spi_dma_prepare() 158 rx_desc->callback_param = drv_data; in pxa2xx_spi_dma_prepare() 160 dmaengine_submit(rx_desc); in pxa2xx_spi_dma_prepare()
|
/linux/drivers/net/ethernet/wangxun/libwx/ |
H A D | wx_lib.c | 160 static __le32 wx_test_staterr(union wx_rx_desc *rx_desc, in wx_test_staterr() argument 163 return rx_desc->wb.upper.status_error & cpu_to_le32(stat_err_bits); in wx_test_staterr() 184 union wx_rx_desc *rx_desc, in wx_get_rx_buffer() argument 192 size = le16_to_cpu(rx_desc->wb.upper.length); in wx_get_rx_buffer() 207 if (!wx_test_staterr(rx_desc, WX_RXD_STAT_EOP)) { in wx_get_rx_buffer() 241 union wx_rx_desc *rx_desc) in wx_build_skb() argument 243 unsigned int size = le16_to_cpu(rx_desc->wb.upper.length); in wx_build_skb() 278 if (!wx_test_staterr(rx_desc, WX_RXD_STAT_EOP)) in wx_build_skb() 333 union wx_rx_desc *rx_desc; in wx_alloc_rx_buffers() local 340 rx_desc = WX_RX_DESC(rx_ring, i); in wx_alloc_rx_buffers() [all …]
|
/linux/drivers/infiniband/ulp/iser/ |
H A D | iser_initiator.c | 228 struct iser_rx_desc *rx_desc; in iser_alloc_rx_descriptors() local 249 rx_desc = iser_conn->rx_descs; in iser_alloc_rx_descriptors() 251 for (i = 0; i < iser_conn->qp_max_recv_dtos; i++, rx_desc++) { in iser_alloc_rx_descriptors() 252 dma_addr = ib_dma_map_single(device->ib_device, (void *)rx_desc, in iser_alloc_rx_descriptors() 257 rx_desc->dma_addr = dma_addr; in iser_alloc_rx_descriptors() 258 rx_desc->cqe.done = iser_task_rsp; in iser_alloc_rx_descriptors() 259 rx_sg = &rx_desc->rx_sg; in iser_alloc_rx_descriptors() 260 rx_sg->addr = rx_desc->dma_addr; in iser_alloc_rx_descriptors() 268 rx_desc = iser_conn->rx_descs; in iser_alloc_rx_descriptors() 269 for (j = 0; j < i; j++, rx_desc++) in iser_alloc_rx_descriptors() [all …]
|
/linux/drivers/net/ethernet/intel/iavf/ |
H A D | iavf_txrx.c | 868 struct iavf_rx_desc *rx_desc; in iavf_alloc_rx_buffers() local 874 rx_desc = IAVF_RX_DESC(rx_ring, ntu); in iavf_alloc_rx_buffers() 886 rx_desc->qw0 = cpu_to_le64(addr); in iavf_alloc_rx_buffers() 888 rx_desc++; in iavf_alloc_rx_buffers() 891 rx_desc = IAVF_RX_DESC(rx_ring, 0); in iavf_alloc_rx_buffers() 896 rx_desc->qw1 = 0; in iavf_alloc_rx_buffers() 1122 * @rx_desc: pointer to the EOP Rx descriptor 1132 const struct iavf_rx_desc *rx_desc, in iavf_process_skb_fields() argument 1138 __le64 qw0 = rx_desc->qw0; in iavf_process_skb_fields() 1139 __le64 qw1 = rx_desc->qw1; in iavf_process_skb_fields() [all …]
|
/linux/drivers/net/ethernet/alteon/ |
H A D | acenic.h | 477 #define RX_STD_RING_SIZE (RX_STD_RING_ENTRIES * sizeof(struct rx_desc)) 480 #define RX_JUMBO_RING_SIZE (RX_JUMBO_RING_ENTRIES *sizeof(struct rx_desc)) 483 #define RX_MINI_RING_SIZE (RX_MINI_RING_ENTRIES *sizeof(struct rx_desc)) 487 sizeof(struct rx_desc)) 489 struct rx_desc{ struct 665 struct rx_desc *rx_std_ring; 666 struct rx_desc *rx_jumbo_ring; 667 struct rx_desc *rx_mini_ring; 668 struct rx_desc *rx_return_ring;
|
/linux/drivers/net/wireless/ti/wl1251/ |
H A D | rx.c | 206 struct wl1251_rx_descriptor *rx_desc; in wl1251_rx() local 211 rx_desc = wl->rx_descriptor; in wl1251_rx() 214 wl1251_rx_header(wl, rx_desc); in wl1251_rx() 217 wl1251_rx_body(wl, rx_desc); in wl1251_rx()
|
/linux/tools/testing/selftests/bpf/prog_tests/ |
H A D | xdp_metadata.c | 119 printf("%p: rx_desc[%d] -> %lx\n", xsk, i, addr); in open_xsk() 261 const struct xdp_desc *rx_desc; in verify_xsk_metadata() local 288 rx_desc = xsk_ring_cons__rx_desc(&xsk->rx, idx); in verify_xsk_metadata() 289 comp_addr = xsk_umem__extract_addr(rx_desc->addr); in verify_xsk_metadata() 290 addr = xsk_umem__add_offset_to_addr(rx_desc->addr); in verify_xsk_metadata() 291 printf("%p: rx_desc[%u]->addr=%llx addr=%llx comp_addr=%llx\n", in verify_xsk_metadata() 292 xsk, idx, rx_desc->addr, addr, comp_addr); in verify_xsk_metadata()
|
/linux/drivers/net/ethernet/hisilicon/hibmcge/ |
H A D | hbg_txrx.c | 399 struct hbg_rx_desc *rx_desc; in hbg_sync_data_from_hw() local 407 rx_desc = (struct hbg_rx_desc *)buffer->skb->data; in hbg_sync_data_from_hw() 408 return FIELD_GET(HBG_RX_DESC_W2_PKT_LEN_M, rx_desc->word2) != 0; in hbg_sync_data_from_hw() 415 struct hbg_rx_desc *rx_desc; in hbg_napi_rx_poll() local 430 rx_desc = (struct hbg_rx_desc *)buffer->skb->data; in hbg_napi_rx_poll() 431 pkt_len = FIELD_GET(HBG_RX_DESC_W2_PKT_LEN_M, rx_desc->word2); in hbg_napi_rx_poll() 433 if (unlikely(!hbg_rx_pkt_check(priv, rx_desc, buffer->skb))) { in hbg_napi_rx_poll()
|
/linux/Documentation/devicetree/bindings/net/ |
H A D | altr,tse.yaml | 104 - const: rx_desc 123 reg-names = "control_port", "rx_csr", "rx_desc", "rx_resp", "tx_csr", "tx_desc", "pcs"; 146 reg-names = "control_port", "rx_csr", "rx_desc", "rx_resp", "tx_csr", "tx_desc";
|
/linux/drivers/net/wireless/ti/wlcore/ |
H A D | hw_ops.h | 45 wlcore_hw_get_rx_buf_align(struct wl1271 *wl, u32 rx_desc) in wlcore_hw_get_rx_buf_align() argument 51 return wl->ops->get_rx_buf_align(wl, rx_desc); in wlcore_hw_get_rx_buf_align() 55 wlcore_hw_prepare_read(struct wl1271 *wl, u32 rx_desc, u32 len) in wlcore_hw_prepare_read() argument 58 return wl->ops->prepare_read(wl, rx_desc, len); in wlcore_hw_prepare_read()
|