Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
soc:2009:asdlkf:journal:week7 [2009/07/11 11:56]
asdlkf
soc:2009:asdlkf:journal:week7 [2009/07/12 11:21] (current)
asdlkf
Line 17: Line 17:
 July 11: Meeting with mentors. Informed that I need to make some "major progress"​ by monday, or be failed. July 11: Meeting with mentors. Informed that I need to make some "major progress"​ by monday, or be failed.
  
-July 12: + 
 Re-wrote probe section of skge.outline Re-wrote probe section of skge.outline
 Moved the software reset section of skge_initialize into a new function and called it in probe instead. (skge_hardware_reset) Moved the software reset section of skge_initialize into a new function and called it in probe instead. (skge_hardware_reset)
Line 29: Line 29:
  
  
-skge_probe ​now looks like this:+outline ​now looks like this:
 <​code>​ <​code>​
 skge_probe skge_probe
Line 47: Line 47:
  netdev_link_down  netdev_link_down
  netdev_link_up  netdev_link_up
 +
 +skge_open
 +
 +
 + Setup RX Resources
 +        ​skge_ring_alloc
 +        ​skge_rx_fill
 +              ​populate_rx_descriptor
 + Setup TX Resources
 +        ​skge_ring_alloc
 +        ​skge_tx_fill
 + skge_start_clocks
 + ​  ​      ​software_reset_device
 +
 +
 +skge_irq
 + netdev_priv
 + 
 + 
 +skge_transmit
 + skge_avail
 + skge_write8
 + 
 +skge_poll
 + skge_extirq
 + skge_process_tx
 + skge_tx_done
 + skge_process_rx
 + skge_rx_desc
 + skge_rx_get
 + netdev_rx
 + skge_refill_rx_ring
 + populate_rx_descriptor
 +
 +skge_close
 + skge_hardware_reset
 + skge_configure_irq
 + skge_free_tx_resources
 + skge_free_rx_resources
 +
 +skge_remove
 + pci_get_Drvdata
 + unregister_netdev
 + netdev_nullify
 + netdev_put
 + 
 </​code>​ </​code>​
 +
  
-re-wrote new outline ​for skge_open+ 
 + 
 +-- removed every line not directly used by probe: 
 + - Commented out all operations in all root (core 7) functions except probe. Recompiled and commented out any "​declaired but unused"​ functions until compiled cleanly. 
 +<​code>​ 
 +cp skge.c skge.c.2 
 +cat skge.c.2 | grep -v \n// > skge.c 
 +</​code>​  
 + - recompiled to check everything'​s running. 
 + 
 +-- Resorted all functions in skge.c based on call order.  
 +-- Changed how netdev_priv() is being used. It was previously being used to store information about the skge_port structure. It is holding the skge_private structure which was previously the skge_adapter structure. 
 + 
 +<​code>​ 
 +struct skge_private { 
 + 
 +        unsigned long     ​regs; ​        //​hardware register base 
 +        uint8_t ​          ​*hw_addr; ​    // 
 +        unsigned long     ​io_base; ​     // physical chip base add 
 +        struct net_device *netdev; ​   // net device instance 
 +        struct skge_port ​ *port; // port specific private variables 
 +        struct pci_device *pdev; ​       // physical device instance 
 +        u32               ​intr_mask;​ 
 +        uint32_t ​         ioaddr; ​      // io address 
 +        uint32_t ​         irqno; ​       // irq number of device 
 +        uint32_t ​         tx_ring_size;​ // 
 +        uint32_t ​         rx_ring_size;​ // 
 +        u16               ​phy_addr; ​    // physical device addres 
 +        u8                chip_id; ​     // chip id of device 
 +        u8                chip_rev; ​    // chip revision 
 +        u8                copper; ​      // medium 
 +        u8                port_count; ​  // number of ports 
 +        u8                phy_type; ​    // ??? 
 +        u32               ​ram_size; ​    // ram size 
 +        u32               ​ram_offset; ​  // ram offset 
 +}; 
 +struct skge_port { 
 +        struct skge_private ​ *adapter; // Link to parent adapter 
 +        struct net_device ​   *netdev; ​ // Link to sibling net_device 
 + 
 +        int                  port_number;​ 
 +        u32                  msg_enable;​ 
 + 
 +        struct skge_ring ​    ​tx_ring;​ 
 + 
 +        struct skge_ring ​    ​rx_ring;​ 
 +        unsigned int         ​rx_buf_size;​ 
 + 
 +        enum pause_control ​  ​flow_control;​ 
 +        enum pause_status ​   flow_status;​ 
 +        u8                   ​rx_csum;​ 
 +        u8                   ​blink_on;​ 
 +        u8                   ​wol;​ 
 +        u8                   ​autoneg; ​  /* AUTONEG_ENABLE,​ AUTONE 
 +        u8                   ​duplex; ​   /* DUPLEX_HALF,​ DUPLEX_FU 
 +        u16                  speed; ​    /* SPEED_1000, SPEED_100,​ 
 +        u32                  advertising;​ 
 + 
 +        void                 ​*mem; ​     /* PCI memory ​for rings * 
 +        u32                  dma; 
 +        unsigned long        mem_size; 
 +        int                  use_xm_link_timer;​ 
 +}; 
 +struct net_device { 
 +        struct refcnt refcnt; 
 +        struct list_head list; 
 +        struct list_head open_list;​ 
 +        char name[8]; 
 +        struct device *dev; 
 +        struct net_device_operations *op; 
 +        struct ll_protocol *ll_protocol;​ 
 +        uint8_t ll_addr[MAX_LL_ADDR_LEN];​ 
 +        unsigned int state; 
 +        size_t max_pkt_len;​ 
 +        struct list_head tx_queue; 
 +        struct list_head rx_queue; 
 +        struct net_device_stats tx_stats; 
 +        struct net_device_stats rx_stats; 
 +        struct generic_settings settings; 
 +        void *priv; 
 +}; 
 + 
 +</​code>​ 
 + 
 + 
 +As an example of how data will be passed around: 
 +<​code>​ 
 +netdev ​                  
 +|->​name ​                         
 +|->​dev ​                          
 +|->​op ​                          
 +|->​ll_adr[] ​                    
 +|->​priv ​                      
 +   ​|->​regs ​                   
 +   ​|->​netdev 
 +   ​| ​ <link to parent> ​             
 +   ​|->​port_count ​            
 +   ​|->​port ​                  
 +   ​| ​ |->​port_number 
 +   ​| ​ |->​tx_ring 
 +   ​| ​ |  |->​*to_use -> skge_element 
 +   ​| ​ |  |->​*to_clean -> skge_element 
 +   ​| ​ |  |->​*start -> skge_element 
 +   ​| ​ |->​rx_ring 
 +   ​| ​ |  |->​*to_use -> skge_element 
 +   ​| ​ |  |->​*to_clean -> skge_element 
 +   ​| ​ |  |->​*start -> skge_element 
 +   ​| ​ |->​rx_buf_size 
 +   ​| ​ |->​autoneg 
 +   ​| ​ |->​duplex 
 +   ​| ​ |->​speed 
 +   ​| ​ |->​advertising 
 +   ​| ​ |->dma 
 +   ​| ​ |->​mem_size 
 +   ​| ​ |->​use_xm_link_timer 
 +   ​|->​pdev ​                
 +   ​|->​tx_ring_size ​             
 +   ​|->​rx_ring_size ​             
 +   ​|->​phy_addr ​                
 +   ​|->​phy_type ​                 
 +   ​|->​chip_id ​                   
 +   ​|->​chip_rev ​                
 +   ​|->​copper ​                
 +   ​|->​ram_size ​                
 +   ​|->​ram_offset ​              
 + 
 + 
 + 
 +</​code>​ 
 + 
 + 
 +I took another look at open, and I'm not happy with the structure as it was; 
 + 
 +It's again been redefined to this (but it's very likely to change by tomorrow).
 <​code>​ <​code>​
 skge_open skge_open
- skge_setup_tx_resources + setup_rx_resources 
- skge_setup_rx_resources+ skge_ring_alloc 
 + refill_rx_ring 
 + populate_rx_descriptor 
 + setup_tx_resources 
 + skge_ring_alloc 
 +  
 + start_clocks 
 + software_reset_device
 </​code>​ </​code>​
- + 
 + 
 + 
 + 
 +Plan for tomorrow: 
 +<​code>​ 
 +/Re-outline existing skge_open in much more detail 
 +|Compare above outline with the intended structure for skge_open 
 +|Separate tx and rx memory sections; perform two malloc_dma'​s instead of one; 
 +\Each tx and rx section of open should be completely separate 
 + 
 +Re-write skge_open (and all it's child functions)in it's new form and outline 
 +Specificly:​ 
 + - Change all instances of netdev_priv (as now netdev_priv is an instance of skge_private,​ not skge_port) 
 + - Enumerate all access to the tx and rx rings and make sure they are using separated access methods. 
 +</​code>​ 
 + 
  
  
 -- Chris -- Chris

QR Code
QR Code soc:2009:asdlkf:journal:week7 (generated for current page)