Lines Matching full:hw

49 struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw)  in vf_to_adapter()  argument
51 return container_of(hw, struct ifcvf_adapter, vf); in vf_to_adapter()
54 static void __iomem *get_cap_addr(struct ifcvf_hw *hw, in get_cap_addr() argument
66 ifcvf= vf_to_adapter(hw); in get_cap_addr()
82 return hw->base[bar] + offset; in get_cap_addr()
99 int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev) in ifcvf_init_hw() argument
127 hw->common_cfg = get_cap_addr(hw, &cap); in ifcvf_init_hw()
128 IFCVF_DBG(pdev, "hw->common_cfg = %p\n", in ifcvf_init_hw()
129 hw->common_cfg); in ifcvf_init_hw()
133 &hw->notify_off_multiplier); in ifcvf_init_hw()
134 hw->notify_bar = cap.bar; in ifcvf_init_hw()
135 hw->notify_base = get_cap_addr(hw, &cap); in ifcvf_init_hw()
136 IFCVF_DBG(pdev, "hw->notify_base = %p\n", in ifcvf_init_hw()
137 hw->notify_base); in ifcvf_init_hw()
140 hw->isr = get_cap_addr(hw, &cap); in ifcvf_init_hw()
141 IFCVF_DBG(pdev, "hw->isr = %p\n", hw->isr); in ifcvf_init_hw()
144 hw->net_cfg = get_cap_addr(hw, &cap); in ifcvf_init_hw()
145 IFCVF_DBG(pdev, "hw->net_cfg = %p\n", hw->net_cfg); in ifcvf_init_hw()
153 if (hw->common_cfg == NULL || hw->notify_base == NULL || in ifcvf_init_hw()
154 hw->isr == NULL || hw->net_cfg == NULL) { in ifcvf_init_hw()
160 ifc_iowrite16(i, &hw->common_cfg->queue_select); in ifcvf_init_hw()
161 notify_off = ifc_ioread16(&hw->common_cfg->queue_notify_off); in ifcvf_init_hw()
162 hw->vring[i].notify_addr = hw->notify_base + in ifcvf_init_hw()
163 notify_off * hw->notify_off_multiplier; in ifcvf_init_hw()
166 hw->lm_cfg = hw->base[IFCVF_LM_BAR]; in ifcvf_init_hw()
170 hw->common_cfg, hw->notify_base, hw->isr, in ifcvf_init_hw()
171 hw->net_cfg, hw->notify_off_multiplier); in ifcvf_init_hw()
176 u8 ifcvf_get_status(struct ifcvf_hw *hw) in ifcvf_get_status() argument
178 return ifc_ioread8(&hw->common_cfg->device_status); in ifcvf_get_status()
181 void ifcvf_set_status(struct ifcvf_hw *hw, u8 status) in ifcvf_set_status() argument
183 ifc_iowrite8(status, &hw->common_cfg->device_status); in ifcvf_set_status()
186 void ifcvf_reset(struct ifcvf_hw *hw) in ifcvf_reset() argument
188 hw->config_cb.callback = NULL; in ifcvf_reset()
189 hw->config_cb.private = NULL; in ifcvf_reset()
191 ifcvf_set_status(hw, 0); in ifcvf_reset()
193 ifcvf_get_status(hw); in ifcvf_reset()
196 static void ifcvf_add_status(struct ifcvf_hw *hw, u8 status) in ifcvf_add_status() argument
199 status |= ifcvf_get_status(hw); in ifcvf_add_status()
201 ifcvf_set_status(hw, status); in ifcvf_add_status()
202 ifcvf_get_status(hw); in ifcvf_add_status()
205 u64 ifcvf_get_features(struct ifcvf_hw *hw) in ifcvf_get_features() argument
207 struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; in ifcvf_get_features()
219 void ifcvf_read_net_config(struct ifcvf_hw *hw, u64 offset, in ifcvf_read_net_config() argument
227 old_gen = ifc_ioread8(&hw->common_cfg->config_generation); in ifcvf_read_net_config()
230 *p++ = ifc_ioread8(hw->net_cfg + offset + i); in ifcvf_read_net_config()
232 new_gen = ifc_ioread8(&hw->common_cfg->config_generation); in ifcvf_read_net_config()
236 void ifcvf_write_net_config(struct ifcvf_hw *hw, u64 offset, in ifcvf_write_net_config() argument
245 ifc_iowrite8(*p++, hw->net_cfg + offset + i); in ifcvf_write_net_config()
248 static void ifcvf_set_features(struct ifcvf_hw *hw, u64 features) in ifcvf_set_features() argument
250 struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; in ifcvf_set_features()
259 static int ifcvf_config_features(struct ifcvf_hw *hw) in ifcvf_config_features() argument
263 ifcvf = vf_to_adapter(hw); in ifcvf_config_features()
264 ifcvf_set_features(hw, hw->req_features); in ifcvf_config_features()
265 ifcvf_add_status(hw, VIRTIO_CONFIG_S_FEATURES_OK); in ifcvf_config_features()
267 if (!(ifcvf_get_status(hw) & VIRTIO_CONFIG_S_FEATURES_OK)) { in ifcvf_config_features()
275 u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid) in ifcvf_get_vq_state() argument
282 ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg; in ifcvf_get_vq_state()
290 int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num) in ifcvf_set_vq_state() argument
296 ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg; in ifcvf_set_vq_state()
299 hw->vring[qid].last_avail_idx = num; in ifcvf_set_vq_state()
305 static int ifcvf_hw_enable(struct ifcvf_hw *hw) in ifcvf_hw_enable() argument
311 ifcvf = vf_to_adapter(hw); in ifcvf_hw_enable()
312 cfg = hw->common_cfg; in ifcvf_hw_enable()
320 for (i = 0; i < hw->nr_vring; i++) { in ifcvf_hw_enable()
321 if (!hw->vring[i].ready) in ifcvf_hw_enable()
325 ifc_iowrite64_twopart(hw->vring[i].desc, &cfg->queue_desc_lo, in ifcvf_hw_enable()
327 ifc_iowrite64_twopart(hw->vring[i].avail, &cfg->queue_avail_lo, in ifcvf_hw_enable()
329 ifc_iowrite64_twopart(hw->vring[i].used, &cfg->queue_used_lo, in ifcvf_hw_enable()
331 ifc_iowrite16(hw->vring[i].size, &cfg->queue_size); in ifcvf_hw_enable()
341 ifcvf_set_vq_state(hw, i, hw->vring[i].last_avail_idx); in ifcvf_hw_enable()
348 static void ifcvf_hw_disable(struct ifcvf_hw *hw) in ifcvf_hw_disable() argument
353 cfg = hw->common_cfg; in ifcvf_hw_disable()
356 for (i = 0; i < hw->nr_vring; i++) { in ifcvf_hw_disable()
364 int ifcvf_start_hw(struct ifcvf_hw *hw) in ifcvf_start_hw() argument
366 ifcvf_reset(hw); in ifcvf_start_hw()
367 ifcvf_add_status(hw, VIRTIO_CONFIG_S_ACKNOWLEDGE); in ifcvf_start_hw()
368 ifcvf_add_status(hw, VIRTIO_CONFIG_S_DRIVER); in ifcvf_start_hw()
370 if (ifcvf_config_features(hw) < 0) in ifcvf_start_hw()
373 if (ifcvf_hw_enable(hw) < 0) in ifcvf_start_hw()
376 ifcvf_add_status(hw, VIRTIO_CONFIG_S_DRIVER_OK); in ifcvf_start_hw()
381 void ifcvf_stop_hw(struct ifcvf_hw *hw) in ifcvf_stop_hw() argument
383 ifcvf_hw_disable(hw); in ifcvf_stop_hw()
384 ifcvf_reset(hw); in ifcvf_stop_hw()
387 void ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid) in ifcvf_notify_queue() argument
389 ifc_iowrite16(qid, hw->vring[qid].notify_addr); in ifcvf_notify_queue()