annotate rathaxes_samples_e1000_split_set_up_device.patch @ 142:cbff597d307e default tip

Wip doc
author Louis Opter <louis@lse.epita.fr>
date Sun, 09 Feb 2014 15:48:57 -0800
parents 6359457dce75
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
1 # HG changeset patch
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
2 # Parent 39b6e7f1b2937f596ed9523741dba01745e50b9d
121
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
3 rathaxes: split and refactor e1000::set_up_device in {Rx,Tx}Ring methods
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
4
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
5 diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
6 --- a/rathaxes/samples/e1000/e1000.blt
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
7 +++ b/rathaxes/samples/e1000/e1000.blt
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
8 @@ -1,4 +1,4 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
9 -with e1000, Ethernet, Socket, PCI, LKM, Log, Builtin
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
10 +with e1000, Ethernet, Socket, DMA, PCI, LKM, Log, Builtin
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
11 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
12 template type e1000::RxDescriptor()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
13 {
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
14 @@ -96,8 +96,165 @@
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
15 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
16 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
17
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
18 + chunk Ethernet::adapter_init_rx(Ethernet::Device rtx_ether_ctx)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
19 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
20 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
21 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
22 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
23 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
24 + * Receive initialization (section 14.4):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
25 + *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
26 + * 1. Program the receive address, in RAL/RAH;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
27 + * 2. Initialize the Multicast Table Array;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
28 + * 3. Program the interrupt mask register (done in
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
29 + * e1000::activate_device_interruption);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
30 + * 4. Allocate the receive descriptor ring and map it to make it
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
31 + * accessible by the device;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
32 + * 5. Write the start address of the ring in RDBAL/RDBAH and set
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
33 + * RDLEN (Receive Descriptor Length) to the size of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
34 + * 6. Set the RDH/RDT (Receive Descriptor Head/Tail) indexes to the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
35 + * beginning and end of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
36 + * 7. Make sure that RCTL.BSIZE and .BSEX are at 0 to configure the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
37 + * receive buffer size to 2048 bytes (e1000::rx_buffer_len).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
38 + * 8. Set RCTL.EN to enable the receiver.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
39 + *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
40 + * The ugly casts here are caused by the lack of CNorm unstrict.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
41 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
42 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
43 + int i;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
44 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
45 + /* 1. Program the receive address */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
46 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
47 + /* (We should use uint{32,16}_t but CNorm doesn't know them yet) */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
48 + rtx_e1000_register_write32(hw_ctx, E1000_RAL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
49 + *(unsigned int *)(${rtx_ether_ctx.dev_addr}));
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
50 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
51 + * The 16 upper bits of RAH also store the AS bits (which should be
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
52 + * 0) and the AV bit (should be 1 to set the address as valid).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
53 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
54 + rtx_e1000_register_write32(hw_ctx, E1000_RAH,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
55 + *(unsigned short *)(&${rtx_ether_ctx.dev_addr}[4]));
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
56 + rtx_e1000_register_set32(hw_ctx, E1000_RAH, E1000_RAH_AV);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
57 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
58 + ${Log::info("adapter_init_rx: receive address programmed")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
59 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
60 + /* 2. Initialize the MTA */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
61 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
62 + for (i = 0; i != 128; ++i)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
63 + rtx_e1000_register_write32(hw_ctx, E1000_MTA + i * 4, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
64 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
65 + ${Log::info("adapter_init_rx: MTA init done")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
66 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
67 + /* 4. Setup the receive descriptor ring */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
68 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
69 + /* Allocate the descriptors */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
70 + hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
71 + hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
72 + hw_ctx->rx_ring.base = dma_alloc_coherent(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
73 + ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
74 + hw_ctx->rx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
75 + &hw_ctx->rx_ring.dma_base,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
76 + GFP_KERNEL);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
77 + /* XXX
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
78 + * The first arg is recognized as Ethernet::Device instead of
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
79 + * Device::AbstractDevice.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
80 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
81 + hw_ctx->rx_ring.base = ${DMA::alloc_coherent(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
82 + rtx_ether_ctx.device, local.hw_ctx.rx_ring.size, local.hw_ctx.rx_ring.dma_base.dma_handle
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
83 + )};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
84 + if (!hw_ctx->rx_ring.base)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
85 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
86 + ${Log::info("adapter_init_rx: cannot allocate the descriptors for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
87 + goto err_rx_ring_alloc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
88 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
89 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
90 + ${Log::info("adapter_init_rx: rx descriptors allocated")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
91 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
92 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
93 + * Allocate the skbuffs, map them for DMA, and write their address
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
94 + * in the corresponding descriptor.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
95 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
96 + for (i = 0; i != ${config.rx_ring_size}; ++i)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
97 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
98 + // XXX #46: ${Socket::SKBuff.ref} skbuff = ${rtx_ether_ctx.net_device.alloc_rx_skbuff(config.rx_buffer_len)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
99 + ${Socket::AbstractSKBuff.ref} k_sk_buff = (${Socket::AbstractSKBuff.ref})netdev_alloc_skb(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
100 + ${rtx_ether_ctx.net_device.k_net_dev}, ${config.rx_buffer_len}
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
101 + );
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
102 + if (!k_sk_buff)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
103 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
104 + ${Log::info("adapter_init_rx: cannot allocate a skbuff for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
105 + goto err_skbuffs_alloc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
106 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
107 + ${Socket::SKBuff.ref} skbuff = &hw_ctx->rx_ring.skbuffs[i];
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
108 + // XXX breaks rtxGen: ${local.skbuff.init(local.k_sk_buff)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
109 + skbuff->skbuff = k_sk_buff;
129
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
110 + *(dma_addr_t *)&(skbuff->dma_handle) = 0;
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
111 + // XXX #46: ${local.skbuff.map_from(rtx_ether_ctx.device)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
112 + if (rtx_socket_skbuff_map(${local.skbuff}, ${rtx_ether_ctx.device}, RTX_DMA_FROM_DEVICE))
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
113 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
114 + ${Log::info("adapter_init_rx: cannot dma-map a skbuff for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
115 + goto err_skbuffs_map;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
116 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
117 + hw_ctx->rx_ring.base[i].buff_addr = cpu_to_le64(${local.skbuff.sk_buff});
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
118 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
119 +
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
120 + // ${Log::info("adapter_init_rx: skbuffs allocated};
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
121 + pr_info("adapter_init_rx: skbuffs allocated, headlen=%d", skb_headlen((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff));
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
122 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
123 + /* 5. Save the emplacement and the size of the ring in RDBA/RDLEN */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
124 + rtx_e1000_register_write32(hw_ctx, E1000_RDBAL, hw_ctx->rx_ring.dma_base & 0xffffffff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
125 + rtx_e1000_register_write32(hw_ctx, E1000_RDBAH, hw_ctx->rx_ring.dma_base >> 32);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
126 + rtx_e1000_register_write32(hw_ctx, E1000_RDLEN, hw_ctx->rx_ring.size);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
127 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
128 + /* 6. Setup RDH/RDT */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
129 + rtx_e1000_register_write32(hw_ctx, E1000_RDH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
130 + rtx_e1000_register_write32(hw_ctx, E1000_RDT, ${config.rx_ring_size} - 1);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
131 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
132 + /* 7. Configure the buffer size, */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
133 + rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_BSIZE_${config.rx_buffer_len});
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
134 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
135 + /* 8. Enable the receiver */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
136 + rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_EN);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
137 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
138 + ${Log::info("adapter_init_rx: receive registers configured and receiver enabled")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
139 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
140 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
141 + * XXX: We can't return here since we are not in a function but
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
142 + * in a chunk of code (injected in a function).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
143 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
144 + goto init_rx_ok;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
145 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
146 + err_skbuffs_alloc:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
147 + while (i--)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
148 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
149 + dma_unmap_single(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
150 + ${rtx_ether_ctx.device},
129
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
151 + /* XXX Leaking cast because of the array: */
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
152 + *((dma_addr_t *)&(hw_ctx->rx_ring.skbuffs[i].dma_handle)),
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
153 + ${config.rx_buffer_len},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
154 + DMA_FROM_DEVICE);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
155 + err_skbuffs_map:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
156 + /* XXX leaking cast: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
157 + dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
158 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
159 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
160 + dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
161 + hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
162 + err_rx_ring_alloc:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
163 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
164 + * XXX: Likewise, if there is something else to rollback in the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
165 + * enclosing function, this won't be done.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
166 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
167 + return -ENOMEM;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
168 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
169 + init_rx_ok: (void)0; /* NOP, to make this a valid label. */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
170 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
171 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
172 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
173 map
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
174 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
175 + size: ((${self}).size);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
176 + dma_base: ((${self}).dma_base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
177 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
178 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
179
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
180 @@ -195,7 +352,7 @@
129
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
181 E1000_TXD_CMD_RS |
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
182 skb_headlen(${local.k_skb.k_sk_buff}));
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
183 tx_desc->upper.data = 0;
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
184 - tx_desc->buff_addr = cpu_to_le64(skb->dma_handle);
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
185 + tx_desc->buff_addr = cpu_to_le64(${local.skb.dma_handle.k_dma_handle});
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
186 memcpy(&self->skbuffs[self->tail], ${local.k_skb.k_sk_buff}, sizeof(*${local.k_skb.k_sk_buff}));
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
187 self->tail = (self->tail + 1) % ${config.tx_ring_size};
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
188 }
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
189 @@ -208,7 +365,62 @@
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
190 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
191 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
192
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
193 - method clean()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
194 + chunk Ethernet::adapter_init_tx(Ethernet::Device rtx_ether_ctx)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
195 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
196 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
197 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
198 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
199 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
200 + * Transmission initialization (section 14.5):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
201 + *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
202 + * 1. Allocate the transmit descriptors ring and map it to make it
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
203 + * accessible by the device;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
204 + * 2. Write the start address of the ring in TDBAL/TDBAH and set
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
205 + * TDLEN to the size of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
206 + * 3. Set the TDH/TDT indexes to the beginning and end of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
207 + * 4. Set TCTL.PSP to pad short packets and TCTL.EN to enable the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
208 + * transmitter.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
209 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
210 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
211 + /* 1. Allocate the tx ring */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
212 + hw_ctx->tx_ring.size = ${config.tx_ring_size} * sizeof(*hw_ctx->tx_ring.base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
213 + hw_ctx->tx_ring.size = ALIGN(hw_ctx->tx_ring.size, 4096);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
214 + hw_ctx->tx_ring.base = dma_alloc_coherent(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
215 + ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
216 + hw_ctx->tx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
217 + &hw_ctx->tx_ring.dma_base,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
218 + GFP_KERNEL);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
219 + if (!hw_ctx->rx_ring.base)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
220 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
221 + ${Log::info("adapter_init_tx: cannot allocate the descriptors for the tx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
222 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
223 + * XXX: If there is something else to rollback in the enclosing
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
224 + * function, this won't be done.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
225 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
226 + return -ENOMEM;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
227 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
228 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
229 + ${Log::info("adapter_init_tx: tx descriptors allocated")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
230 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
231 + /* 2. Save the emplacement and the size of the ring in TDBA/TDLEN */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
232 + rtx_e1000_register_write32(hw_ctx, E1000_TDBAL, hw_ctx->tx_ring.dma_base & 0xffffffff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
233 + rtx_e1000_register_write32(hw_ctx, E1000_TDBAH, hw_ctx->tx_ring.dma_base >> 32);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
234 + rtx_e1000_register_write32(hw_ctx, E1000_TDLEN, hw_ctx->tx_ring.size);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
235 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
236 + /* 3. Setup TDH/TDT to zero: the queue is empty */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
237 + rtx_e1000_register_write32(hw_ctx, E1000_TDH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
238 + rtx_e1000_register_write32(hw_ctx, E1000_TDT, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
239 + hw_ctx->tx_ring.head = 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
240 + hw_ctx->tx_ring.tail = 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
241 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
242 + /* 4. Set TCTL.PSP and enable the transmitter */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
243 + rtx_e1000_register_set32(hw_ctx, E1000_TCTL, E1000_TCTL_PSP|E1000_TCTL_EN);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
244 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
245 + ${Log::info("adapter_init_tx: transmit registers configured and transmitter enabled")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
246 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
247 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
248 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
249 + method clean()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
250 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
251 rtx_e1000_tx_ring_clean(${self});
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
252 }
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
253 @@ -247,9 +459,8 @@
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
254 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
255 int bars;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
256 unsigned char /* __iomem */ *ioaddr;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
257 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
258 - ${e1000::RxRing} rx_ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
259 - ${e1000::TxRing} tx_ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
260 + ${e1000::RxRing.scalar} rx_ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
261 + ${e1000::TxRing.scalar} tx_ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
262 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
263
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
264 chunk Ethernet::HardwareContext()
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
265 @@ -309,10 +520,53 @@
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
266 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
267 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
268
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
269 + chunk Ethernet::adapter_setup(Ethernet::Device rtx_ether_ctx)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
270 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
271 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
272 + ${e1000::Context.ref} hw_ctx = &${rtx_ether_ctx}->hw_ctx;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
273 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
274 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
275 + * "General Configuration" (section 14.3):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
276 + *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
277 + * - CTRL.ASDE/CTRL.SLU: Let the PHY handle the speed detection &
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
278 + * negociation;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
279 + * - CTRL.LRST/FRCSPD: Unset them to initiate the auto-negociation;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
280 + * - CTRL.PHY_RST: Unset it;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
281 + * - CTRL.ILOS: Unset it (ILOS is Invert Loss Of Signal);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
282 + * - CTRL.VME: Make sure it's not set to disable VLAN support;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
283 + * - Set the control flow registers to 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
284 + * - Finally, initialize all the statistic registers from
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
285 + * E1000_CRCERRS to E1000_TSCTFC.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
286 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
287 + rtx_e1000_register_set32(hw_ctx, E1000_CTRL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
288 + E1000_CMD_ASDE |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
289 + E1000_CMD_SLU);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
290 + rtx_e1000_register_unset32(hw_ctx, E1000_CTRL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
291 + E1000_CMD_LRST |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
292 + E1000_CMD_FRCSPD |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
293 + E1000_CMD_PHY_RST |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
294 + E1000_CMD_ILOS |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
295 + E1000_CMD_VME);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
296 + rtx_e1000_register_write32(hw_ctx, E1000_FCAH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
297 + rtx_e1000_register_write32(hw_ctx, E1000_FCAL, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
298 + rtx_e1000_register_write32(hw_ctx, E1000_FCT, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
299 + rtx_e1000_register_write32(hw_ctx, E1000_FCTTV, 0);
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
300 + /*
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
301 + * XXX: Using int i clashes with another int i from the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
302 + * "parent" chunk:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
303 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
304 + for (int j = 0; j != 64; ++j)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
305 + rtx_e1000_register_write32(hw_ctx, E1000_CRCERRS + j * 4, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
306 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
307 + ${Log::info("adapter_setup: general configuration done")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
308 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
309 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
310 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
311 map
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
312 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
313 + rx_ring: ((${self})->rx_ring);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
314 + //tx_ring: ((${self})->tx_ring);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
315 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
316 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
317 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
318
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
319 template type e1000::Register()
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
320 @@ -615,269 +869,6 @@
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
321 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
322 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
323
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
324 - /* TODO: refactor
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
325 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
326 - * Split into two method methods:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
327 - * - e1000::RxRing::init_rx()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
328 - * - e1000::TxRing::init_tx()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
329 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
330 - * Also it should use the new methods in Socket::SKbuff.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
331 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
332 - template sequence set_up_device(Ethernet::Device rtx_ether_ctx)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
333 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
334 - chunk ::CALL()
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
335 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
336 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
337 - * This part is documented in the Intel Gigabit Ethernet Controller
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
338 - * Software Developper manual. (You can find it in the doc/hardware
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
339 - * directory).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
340 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
341 - * Since this part is actually completely device specific it should
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
342 - * not be written here. (but in the front-end).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
343 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
344 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
345 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
346 - * shortcut hw_ctx... maybe we should directly take an
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
347 - * e1000::Context? (but we would need to make it point back to
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
348 - * the struct net_device)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
349 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
350 - ${e1000::Context.ref} hw_ctx;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
351 - hw_ctx = &${rtx_ether_ctx}->hw_ctx;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
352 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
353 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
354 - * "General Configuration" (section 14.3):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
355 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
356 - * - CTRL.ASDE/CTRL.SLU: Let the PHY handle the speed detection &
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
357 - * negociation;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
358 - * - CTRL.LRST/FRCSPD: Unset them to initiate the auto-negociation;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
359 - * - CTRL.PHY_RST: Unset it;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
360 - * - CTRL.ILOS: Unset it (ILOS is Invert Loss Of Signal);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
361 - * - CTRL.VME: Make sure it's not set to disable VLAN support;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
362 - * - Set the control flow registers to 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
363 - * - Finally, initialize all the statistic registers from
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
364 - * E1000_CRCERRS to E1000_TSCTFC.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
365 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
366 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
367 - int i;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
368 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
369 - rtx_e1000_register_set32(hw_ctx, E1000_CTRL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
370 - E1000_CMD_ASDE |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
371 - E1000_CMD_SLU);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
372 - rtx_e1000_register_unset32(hw_ctx, E1000_CTRL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
373 - E1000_CMD_LRST |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
374 - E1000_CMD_FRCSPD |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
375 - E1000_CMD_PHY_RST |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
376 - E1000_CMD_ILOS |
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
377 - E1000_CMD_VME);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
378 - rtx_e1000_register_write32(hw_ctx, E1000_FCAH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
379 - rtx_e1000_register_write32(hw_ctx, E1000_FCAL, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
380 - rtx_e1000_register_write32(hw_ctx, E1000_FCT, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
381 - rtx_e1000_register_write32(hw_ctx, E1000_FCTTV, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
382 - for (i = 0; i != 64; ++i)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
383 - rtx_e1000_register_write32(hw_ctx, E1000_CRCERRS + i * 4, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
384 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
385 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
386 - ${Log::info("setup_device: general configuration done")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
387 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
388 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
389 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
390 - * Receive initialization (section 14.4):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
391 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
392 - * 1. Program the receive address, in RAL/RAH;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
393 - * 2. Initialize the Multicast Table Array;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
394 - * 3. Program the interrupt mask register (done in
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
395 - * e1000::activate_device_interruption);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
396 - * 4. Allocate the receive descriptor ring and map it to make it
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
397 - * accessible by the device;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
398 - * 5. Write the start address of the ring in RDBAL/RDBAH and set
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
399 - * RDLEN (Receive Descriptor Length) to the size of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
400 - * 6. Set the RDH/RDT (Receive Descriptor Head/Tail) indexes to the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
401 - * beginning and end of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
402 - * 7. Make sure that RCTL.BSIZE and .BSEX are at 0 to configure the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
403 - * receive buffer size to 2048 bytes (e1000::rx_buffer_len).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
404 - * 8. Set RCTL.EN to enable the receiver.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
405 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
406 - * The ugly casts here are caused by the lack of CNorm unstrict.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
407 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
408 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
409 - /* 1. Program the receive address */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
410 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
411 - /* (We should use uint{32,16}_t but CNorm doesn't know them yet) */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
412 - rtx_e1000_register_write32(hw_ctx, E1000_RAL,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
413 - *(unsigned int *)(${rtx_ether_ctx.dev_addr}));
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
414 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
415 - * The 16 upper bits of RAH also store the AS bits (which should be
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
416 - * 0) and the AV bit (should be 1 to set the address as valid).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
417 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
418 - rtx_e1000_register_write32(hw_ctx, E1000_RAH,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
419 - *(unsigned short *)(&${rtx_ether_ctx.dev_addr}[4]));
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
420 - rtx_e1000_register_set32(hw_ctx, E1000_RAH, E1000_RAH_AV);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
421 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
422 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
423 - ${Log::info("setup_device: receive address programmed")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
424 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
425 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
426 - /* 2. Initialize the MTA */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
427 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
428 - for (i = 0; i != 128; ++i)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
429 - rtx_e1000_register_write32(hw_ctx, E1000_MTA + i * 4, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
430 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
431 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
432 - ${Log::info("setup_device: MTA init done")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
433 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
434 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
435 - /* 4. Setup the receive descriptor ring */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
436 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
437 - /* Allocate the descriptors */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
438 - hw_ctx->rx_ring.size = ${config.rx_ring_size} * sizeof(*hw_ctx->rx_ring.base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
439 - hw_ctx->rx_ring.size = ALIGN(hw_ctx->rx_ring.size, 4096);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
440 - hw_ctx->rx_ring.base = dma_alloc_coherent(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
441 - ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
442 - hw_ctx->rx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
443 - &hw_ctx->rx_ring.dma_base,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
444 - GFP_KERNEL);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
445 - if (!hw_ctx->rx_ring.base)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
446 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
447 - ${Log::info("cannot allocate the descriptors for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
448 - goto err_rx_ring_alloc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
449 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
450 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
451 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
452 - ${Log::info("setup_device: rx descriptors allocated")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
453 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
454 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
455 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
456 - * Allocate the skbuffs, map them for DMA, and write their address
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
457 - * in the corresponding descriptor.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
458 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
459 - for (i = 0; i != ${config.rx_ring_size}; ++i)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
460 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
461 - hw_ctx->rx_ring.skbuffs[i].skbuff = (${Socket::AbstractSKBuff}*)netdev_alloc_skb(
121
6f600f83a763 WIP, fix Ethernet::Device::alloc_rx_skbuff
Louis Opter <louis@lse.epita.fr>
parents:
diff changeset
462 - ${rtx_ether_ctx.net_device.k_net_dev}, /* XXX: .k_net_dev isn't expanded here */
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
463 - ${config.rx_buffer_len});
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
464 - if (!hw_ctx->rx_ring.skbuffs[i].skbuff)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
465 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
466 - ${Log::info("cannot allocate a skbuff for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
467 - goto err_skbuffs_alloc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
468 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
469 - hw_ctx->rx_ring.skbuffs[i].dma_handle = dma_map_single(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
470 - ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
471 - (struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff, /* XXX leaking cast */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
472 - ${config.rx_buffer_len},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
473 - DMA_FROM_DEVICE);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
474 - int dma_error = dma_mapping_error(${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
475 - hw_ctx->rx_ring.skbuffs[i].dma_handle);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
476 - if (dma_error)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
477 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
478 - ${Log::info("cannot dma-map a skbuff for the rx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
479 - goto err_skbuffs_map;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
480 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
481 - hw_ctx->rx_ring.base[i].buff_addr = cpu_to_le64(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
482 - hw_ctx->rx_ring.skbuffs[i].skbuff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
483 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
484 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
485 - ${Log::info("setup_device: skbuffs allocated")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
486 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
487 - /* 5. Save the emplacement and the size of the ring in RDBA/RDLEN */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
488 - rtx_e1000_register_write32(hw_ctx, E1000_RDBAL, hw_ctx->rx_ring.dma_base & 0xffffffff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
489 - rtx_e1000_register_write32(hw_ctx, E1000_RDBAH, hw_ctx->rx_ring.dma_base >> 32);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
490 - rtx_e1000_register_write32(hw_ctx, E1000_RDLEN, hw_ctx->rx_ring.size);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
491 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
492 - /* 6. Setup RDH/RDT */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
493 - rtx_e1000_register_write32(hw_ctx, E1000_RDH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
494 - rtx_e1000_register_write32(hw_ctx, E1000_RDT, ${config.rx_ring_size} - 1);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
495 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
496 - /* 7. Configure the buffer size, */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
497 - rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_BSIZE_${config.rx_buffer_len});
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
498 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
499 - /* 8. Enable the receiver */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
500 - rtx_e1000_register_set32(hw_ctx, E1000_RCTL, E1000_RCTL_EN);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
501 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
502 - ${Log::info("setup_device: receive registers configured and receiver enabled")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
503 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
504 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
505 - * Transmission initialization (section 14.5):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
506 - *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
507 - * 1. Allocate the transmit descriptors ring and map it to make it
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
508 - * accessible by the device;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
509 - * 2. Write the start address of the ring in TDBAL/TDBAH and set
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
510 - * TDLEN to the size of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
511 - * 3. Set the TDH/TDT indexes to the beginning and end of the ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
512 - * 4. Set TCTL.PSP to pad short packets and TCTL.EN to enable the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
513 - * transmitter.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
514 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
515 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
516 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
517 - * XXX: at this point we must be careful to not fuck up with i, or
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
518 - * we are going go have surprises in `err_skbuffs_alloc`. Maybe it's
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
519 - * time to separate the rx and tx initialization in two functions.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
520 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
521 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
522 - /* 1. Allocate the tx ring */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
523 - hw_ctx->tx_ring.size = ${config.tx_ring_size} * sizeof(*hw_ctx->tx_ring.base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
524 - hw_ctx->tx_ring.size = ALIGN(hw_ctx->tx_ring.size, 4096);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
525 - hw_ctx->tx_ring.base = dma_alloc_coherent(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
526 - ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
527 - hw_ctx->tx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
528 - &hw_ctx->tx_ring.dma_base,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
529 - GFP_KERNEL);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
530 - if (!hw_ctx->rx_ring.base)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
531 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
532 - ${Log::info("cannot allocate the descriptors for the tx ring")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
533 - goto err_tx_ring_alloc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
534 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
535 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
536 - ${Log::info("setup_device: tx descriptors allocated")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
537 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
538 - /* 2. Save the emplacement and the size of the ring in TDBA/TDLEN */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
539 - rtx_e1000_register_write32(hw_ctx, E1000_TDBAL, hw_ctx->tx_ring.dma_base & 0xffffffff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
540 - rtx_e1000_register_write32(hw_ctx, E1000_TDBAH, hw_ctx->tx_ring.dma_base >> 32);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
541 - rtx_e1000_register_write32(hw_ctx, E1000_TDLEN, hw_ctx->tx_ring.size);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
542 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
543 - /* 3. Setup TDH/TDT to zero: the queue is empty */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
544 - rtx_e1000_register_write32(hw_ctx, E1000_TDH, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
545 - rtx_e1000_register_write32(hw_ctx, E1000_TDT, 0);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
546 - hw_ctx->tx_ring.head = 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
547 - hw_ctx->tx_ring.tail = 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
548 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
549 - /* 4. Set TCTL.PSP and enable the transmitter */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
550 - rtx_e1000_register_set32(hw_ctx, E1000_TCTL, E1000_TCTL_PSP|E1000_TCTL_EN);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
551 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
552 - ${Log::info("transmit registers configured and transmitter enabled")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
553 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
554 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
555 - * XXX: We can't return here since we are not in a function but in
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
556 - * a chunk of code (injected in a function).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
557 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
558 - goto ok;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
559 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
560 - err_tx_ring_alloc:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
561 - /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
562 - * Likewise, always the same problem with error handling, we don't
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
563 - * know where we are at in the "parent context":
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
564 - */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
565 - err_skbuffs_alloc:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
566 - while (i--)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
567 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
568 - dma_unmap_single(
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
569 - ${rtx_ether_ctx.device},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
570 - hw_ctx->rx_ring.skbuffs[i].dma_handle,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
571 - ${config.rx_buffer_len},
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
572 - DMA_FROM_DEVICE);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
573 - err_skbuffs_map:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
574 - /* XXX leaking cast: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
575 - dev_kfree_skb((struct sk_buff *)hw_ctx->rx_ring.skbuffs[i].skbuff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
576 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
577 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
578 - dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx->rx_ring.size,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
579 - hw_ctx->rx_ring.base, hw_ctx->rx_ring.dma_base);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
580 - err_rx_ring_alloc:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
581 - return -ENOMEM;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
582 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
583 - ok:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
584 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
585 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
586 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
587 /* TODO:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
588 *
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
589 * Refactor into two methods (one in RxRing and one in TxRing) and make use
130
Louis Opter <louis@lse.epita.fr>
parents: 129
diff changeset
590 @@ -901,15 +892,18 @@
129
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
591 */
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
592 for (int i = 0; i != ${config.rx_ring_size}; ++i)
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
593 {
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
594 + /*
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
595 + * XXX Leaking casts:
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
596 + *
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
597 + * We should go through the rtx types (Socket::SKBuff,
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
598 + * AbstractSKBuff), but we can't because of the array here,
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
599 + * which is not supported by the compiler.
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
600 + */
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
601 dma_unmap_single(
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
602 ${rtx_ether_ctx.device},
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
603 - (dma_addr_t)hw_ctx_->rx_ring.skbuffs[i].dma_handle,
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
604 + *((dma_addr_t *)&(hw_ctx_->rx_ring.skbuffs[i].dma_handle)),
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
605 ${config.rx_buffer_len},
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
606 DMA_FROM_DEVICE);
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
607 - /* XXX Leaking cast
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
608 - * (We should go through the rtx types (Socket::SKBuff,
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
609 - * AbstractSKBuff)
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
610 - */
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
611 dev_kfree_skb((struct sk_buff *)hw_ctx_->rx_ring.skbuffs[i].skbuff);
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
612 }
518d9c8ac70c Clean-up the patch queue
Louis Opter <louis@lse.epita.fr>
parents: 122
diff changeset
613 dma_free_coherent(${rtx_ether_ctx.device}, hw_ctx_->rx_ring.size,
122
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
614 diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
615 --- a/rathaxes/samples/e1000/e1000.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
616 +++ b/rathaxes/samples/e1000/e1000.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
617 @@ -1,23 +1,10 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
618 -interface e1000 : Socket, Ethernet, PCI, LKM, Builtin
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
619 +interface e1000 : Socket, Ethernet, DMA, PCI, LKM, Builtin
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
620 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
621 required variable Builtin::number rx_ring_size;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
622 required variable Builtin::number tx_ring_size;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
623 required variable Builtin::number rx_buffer_len;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
624 required variable Builtin::number tx_max_data_per_desc;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
625
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
626 - provided type Context
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
627 - {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
628 - chunk Ethernet::HardwareContext();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
629 - decl data_types();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
630 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
631 - /* Callbacks/Hooks which should probably be in the front-end: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
632 - chunk Ethernet::adapter_init_context(Ethernet::Device,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
633 - Builtin::number,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
634 - Builtin::symbol);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
635 - chunk Ethernet::adapter_reset(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
636 - chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
637 - }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
638 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
639 provided type RxDescriptor
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
640 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
641 chunk LKM::includes();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
642 @@ -35,6 +22,32 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
643 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
644 decl data_types();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
645 method init();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
646 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
647 + /* XXX: Callback that should be in the front-end: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
648 + chunk Ethernet::adapter_init_rx(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
649 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
650 + attribute DMA::DMAHandle.scalar dma_base;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
651 + attribute Builtin::number.scalar size;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
652 + }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
653 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
654 + provided type Context
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
655 + {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
656 + chunk Ethernet::HardwareContext();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
657 + decl data_types();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
658 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
659 + /* XXX:
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
660 + * These callbacks/Hooks which should probably be in the front-end.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
661 + * Also, I'm not too happy about the names, it's difficult to make
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
662 + * the difference between the probe and open parts.
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
663 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
664 + chunk Ethernet::adapter_init_context(Ethernet::Device,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
665 + Builtin::number,
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
666 + Builtin::symbol);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
667 + chunk Ethernet::adapter_reset(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
668 + chunk Ethernet::adapter_load_mac_address(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
669 + chunk Ethernet::adapter_setup(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
670 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
671 + attribute RxRing.scalar rx_ring;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
672 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
673
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
674 provided type TxRing
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
675 @@ -44,6 +57,9 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
676 decl data_types();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
677 method init();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
678
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
679 + /* XXX: Callback that should be in the front-end: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
680 + chunk Ethernet::adapter_init_tx(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
681 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
682 /* Clean the ring (i.e: move the head closer to the tail): */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
683 method clean();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
684 /* Return the number of clean descriptors left in the ring: */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
685 diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
686 --- a/rathaxes/samples/e1000/ethernet.blt
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
687 +++ b/rathaxes/samples/e1000/ethernet.blt
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
688 @@ -170,6 +170,9 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
689 ${Log::info("Cannot register the interrupt handler")};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
690 return error;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
691 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
692 + ${pointcut Ethernet::adapter_setup(local.rtx_ether_ctx)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
693 + ${pointcut Ethernet::adapter_init_rx(local.rtx_ether_ctx)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
694 + ${pointcut Ethernet::adapter_init_tx(local.rtx_ether_ctx)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
695 ${pointcut ::IMPLEMENTATION(local.rtx_ether_ctx)};
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
696
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
697 return 0;
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
698 diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
699 --- a/rathaxes/samples/e1000/ethernet.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
700 +++ b/rathaxes/samples/e1000/ethernet.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
701 @@ -52,6 +52,15 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
702 provided chunk LKM::includes();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
703 provided chunk LKM::prototypes();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
704 provided chunk LKM::code();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
705 +
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
706 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
707 + * For e1000, this part is documented in the Intel Gigabit Ethernet
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
708 + * Controller Software Developper manual. (You can find it in the
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
709 + * doc/hardware directory).
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
710 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
711 + provided pointcut Ethernet::adapter_setup(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
712 + provided pointcut Ethernet::adapter_init_rx(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
713 + provided pointcut Ethernet::adapter_init_tx(Ethernet::Device);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
714 }
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
715
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
716 required sequence send(Ethernet::Device, Socket::AbstractSKBuff)
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
717 diff --git a/rathaxes/samples/e1000/lkm.rtx b/rathaxes/samples/e1000/lkm.rtx
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
718 --- a/rathaxes/samples/e1000/lkm.rtx
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
719 +++ b/rathaxes/samples/e1000/lkm.rtx
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
720 @@ -4,10 +4,6 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
721 {
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
722 Log::info("opening the device");
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
723
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
724 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
725 - e1000::set_up_device(dev);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
726 - Log::info("device activated");
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
727 -
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
728 e1000::activate_device_interruption(dev);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
729 Log::info("interruption enabled");
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
730
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
731 diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
732 --- a/rathaxes/samples/e1000/socket.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
733 +++ b/rathaxes/samples/e1000/socket.rti
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
734 @@ -15,6 +15,10 @@
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
735 decl data_types();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
736 method init(Socket::AbstractSKBuff);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
737 method dump_infos();
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
738 + /*
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
739 + * map_to and map_from return a non-zero value on failure (which
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
740 + * doesn't correspond to an errno value):
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
741 + */
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
742 method map_to(Device::AbstractDevice);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
743 method map_from(Device::AbstractDevice);
52402232483f WIP on the split up of e1000::set_up_device
Louis Opter <louis@lse.epita.fr>
parents: 121
diff changeset
744 method unmap_to_and_free(Device::AbstractDevice);