Lines Matching refs:state

81 static status_t pcnet_set_state(struct device *dev, struct netstack_state *state);
102 struct pcnet_state *state = dev->state; in pcnet_read_csr() local
104 outpd(state->base + REG_RAP, rap); in pcnet_read_csr()
105 return inpd(state->base + REG_RDP); in pcnet_read_csr()
109 struct pcnet_state *state = dev->state; in pcnet_write_csr() local
111 outpd(state->base + REG_RAP, rap); in pcnet_write_csr()
112 outpd(state->base + REG_RDP, data); in pcnet_write_csr()
116 struct pcnet_state *state = dev->state; in pcnet_read_bcr() local
118 outpd(state->base + REG_RAP, rap); in pcnet_read_bcr()
119 return inpd(state->base + REG_BDP); in pcnet_read_bcr()
123 struct pcnet_state *state = dev->state; in pcnet_write_bcr() local
125 outpd(state->base + REG_RAP, rap); in pcnet_write_bcr()
126 outpd(state->base + REG_BDP, data); in pcnet_write_bcr()
144 struct pcnet_state *state = calloc(1, sizeof(struct pcnet_state)); in pcnet_init() local
145 if (!state) in pcnet_init()
148 dev->state = state; in pcnet_init()
155 state->padr[i] = inp(state->base + i); in pcnet_init()
157 LTRACEF("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", state->padr[0], state->padr[1], state->padr[2], in pcnet_init()
158 state->padr[3], state->padr[4], state->padr[5]); in pcnet_init()
161 outpd(state->base + 0, 0); in pcnet_init()
173 state->td_count = 128; in pcnet_init()
174 state->rd_count = 128; in pcnet_init()
175 state->td = memalign(16, state->td_count * DESC_SIZE); in pcnet_init()
176 state->rd = memalign(16, state->rd_count * DESC_SIZE); in pcnet_init()
178 state->rx_buffers = calloc(state->rd_count, sizeof(struct pbuf *)); in pcnet_init()
179 state->tx_buffers = calloc(state->td_count, sizeof(struct pbuf *)); in pcnet_init()
181 state->tx_pending = 0; in pcnet_init()
183 if (!state->td || !state->rd || !state->tx_buffers || !state->rx_buffers) { in pcnet_init()
188 memset(state->td, 0, state->td_count * DESC_SIZE); in pcnet_init()
189 memset(state->rd, 0, state->rd_count * DESC_SIZE); in pcnet_init()
192 state->ib = memalign(4, sizeof(struct init_block_32)); in pcnet_init()
193 if (!state->ib) { in pcnet_init()
198 LTRACEF("Init block addr: %p\n", state->ib); in pcnet_init()
201 state->ib->tlen = 7; // 128 descriptors in pcnet_init()
202 state->ib->rlen = 7; // 128 descriptors in pcnet_init()
203 state->ib->mode = 0; in pcnet_init()
205 state->ib->ladr = ~0; in pcnet_init()
206 state->ib->tdra = (uint32_t) state->td; in pcnet_init()
207 state->ib->rdra = (uint32_t) state->rd; in pcnet_init()
209 memcpy(state->ib->padr, state->padr, 6); in pcnet_init()
212 pcnet_write_csr(dev, 1, (uint32_t) state->ib); in pcnet_init()
213 pcnet_write_csr(dev, 2, (uint32_t) state->ib >> 16); in pcnet_init()
216 for (i=0; i < state->rd_count; i++) { in pcnet_init()
220 state->rd[i].rbadr = (uint32_t) p->payload; in pcnet_init()
221 state->rd[i].bcnt = -p->tot_len; in pcnet_init()
222 state->rd[i].ones = 0xf; in pcnet_init()
223 state->rd[i].own = 1; in pcnet_init()
225 state->rx_buffers[i] = p; in pcnet_init()
228 mutex_init(&state->tx_lock); in pcnet_init()
230 state->done = false; in pcnet_init()
231 event_init(&state->event, false, EVENT_FLAG_AUTOUNSIGNAL); in pcnet_init()
232 event_init(&state->initialized, false, 0); in pcnet_init()
238 register_int_handler(state->irq, pcnet_irq_handler, dev); in pcnet_init()
239 unmask_interrupt(state->irq); in pcnet_init()
247 res = event_wait_timeout(&state->initialized, PCNET_INIT_TIMEOUT); in pcnet_init()
260 if (state) { in pcnet_init()
261 free(state->td); in pcnet_init()
262 free(state->rd); in pcnet_init()
263 free(state->ib); in pcnet_init()
264 free(state->tx_buffers); in pcnet_init()
265 free(state->rx_buffers); in pcnet_init()
268 free(state); in pcnet_init()
278 DEBUG_ASSERT(dev->state); in pcnet_read_pci_config()
280 struct pcnet_state *state = dev->state; in pcnet_read_pci_config() local
290 state->base = config.type0.base_addresses[i] & ~0x3; in pcnet_read_pci_config()
295 if (!state->base) { in pcnet_read_pci_config()
303 state->irq = config.type0.interrupt_line + INT_BASE; in pcnet_read_pci_config()
321 struct pcnet_state *state = dev->state; in pcnet_irq_handler() local
323 mask_interrupt(state->irq); in pcnet_irq_handler()
329 event_signal(&state->event, false); in pcnet_irq_handler()
338 struct pcnet_state *state = dev->state; in pcnet_thread() local
343 while (!state->done) { in pcnet_thread()
346 event_wait(&state->event); in pcnet_thread()
364 free(state->ib); in pcnet_thread()
365 state->ib = NULL; in pcnet_thread()
367 event_signal(&state->initialized, true); in pcnet_thread()
386 unmask_interrupt(state->irq); in pcnet_thread()
399 struct pcnet_state *state = dev->state; in pcnet_service_tx() local
401 mutex_acquire(&state->tx_lock); in pcnet_service_tx()
403 struct td_style3 *td = &state->td[state->td_tail]; in pcnet_service_tx()
405 if (state->tx_pending && td->own == 0) { in pcnet_service_tx()
406 struct pbuf *p = state->tx_buffers[state->td_tail]; in pcnet_service_tx()
409 state->tx_buffers[state->td_tail] = NULL; in pcnet_service_tx()
411 LTRACEF("Retiring packet: td_tail=%d p=%p tot_len=%u\n", state->td_tail, p, p->tot_len); in pcnet_service_tx()
413 state->tx_pending--; in pcnet_service_tx()
414 state->td_tail = (state->td_tail + 1) % state->td_count; in pcnet_service_tx()
421 mutex_release(&state->tx_lock); in pcnet_service_tx()
428 mutex_release(&state->tx_lock); in pcnet_service_tx()
432 for (int i=0; i < state->td_count; i++) in pcnet_service_tx()
433 printf("%d ", state->td[i].own); in pcnet_service_tx()
445 struct pcnet_state *state = dev->state; in pcnet_service_rx() local
447 struct rd_style3 *rd = &state->rd[state->rd_head]; in pcnet_service_rx()
450 struct pbuf *p = state->rx_buffers[state->rd_head]; in pcnet_service_rx()
453 LTRACEF("Processing RX descriptor %d\n", state->rd_head); in pcnet_service_rx()
468 class_netstack_input(dev, state->netstack_state, p); in pcnet_service_rx()
470 … p = state->rx_buffers[state->rd_head] = pbuf_alloc(PBUF_RAW, MAX_PACKET_SIZE, PBUF_RAM); in pcnet_service_rx()
484 state->rd_head = (state->rd_head + 1) % state->rd_count; in pcnet_service_rx()
490 LTRACEF("Nothing to do for RX: rd_head=%d.\n", state->rd_head); in pcnet_service_rx()
491 for (int i=0; i < state->rd_count; i++) in pcnet_service_rx()
492 printf("%d ", state->rd[i].own); in pcnet_service_rx()
505 if (!dev->state) in pcnet_set_state()
508 struct pcnet_state *state = dev->state; in pcnet_set_state() local
510 state->netstack_state = netstack_state; in pcnet_set_state()
519 if (!dev->state) in pcnet_get_hwaddr()
522 struct pcnet_state *state = dev->state; in pcnet_get_hwaddr() local
524 memcpy(buf, state->padr, MIN(sizeof(state->padr), max_len)); in pcnet_get_hwaddr()
526 return sizeof(state->padr); in pcnet_get_hwaddr()
542 if (!dev->state) in pcnet_output()
546 struct pcnet_state *state = dev->state; in pcnet_output() local
548 mutex_acquire(&state->tx_lock); in pcnet_output()
550 struct td_style3 *td = &state->td[state->td_head]; in pcnet_output()
562 LTRACEF("Queuing packet: td_head=%d p=%p tot_len=%u\n", state->td_head, p, p->tot_len); in pcnet_output()
576 state->tx_buffers[state->td_head] = p; in pcnet_output()
577 state->tx_pending++; in pcnet_output()
579 state->td_head = (state->td_head + 1) % state->td_count; in pcnet_output()
587 mutex_release(&state->tx_lock); in pcnet_output()