Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/rtl8139/driver.c

    re777847 r5cd3d67  
    3939#include <io/log.h>
    4040#include <nic.h>
    41 #include <packet_client.h>
    4241#include <device/pci.h>
    4342
     
    5655/** Global mutex for work with shared irq structure */
    5756FIBRIL_MUTEX_INITIALIZE(irq_reg_lock);
     57
    5858/** Lock interrupt structure mutex */
    59 #define RTL8139_IRQ_STRUCT_LOCK() fibril_mutex_lock(&irq_reg_lock)
     59#define RTL8139_IRQ_STRUCT_LOCK() \
     60        fibril_mutex_lock(&irq_reg_lock)
     61
    6062/** Unlock interrupt structure mutex */
    61 #define RTL8139_IRQ_STRUCT_UNLOCK() fibril_mutex_unlock(&irq_reg_lock)
     63#define RTL8139_IRQ_STRUCT_UNLOCK() \
     64        fibril_mutex_unlock(&irq_reg_lock)
    6265
    6366/** PCI clock frequency in kHz */
    64 #define RTL8139_PCI_FREQ_KHZ 33000
    65 
    66 #define RTL8139_AUTONEG_CAPS (ETH_AUTONEG_10BASE_T_HALF \
    67     | ETH_AUTONEG_10BASE_T_FULL | ETH_AUTONEG_100BASE_TX_HALF \
    68     | ETH_AUTONEG_100BASE_TX_FULL | ETH_AUTONEG_PAUSE_SYMETRIC)
     67#define RTL8139_PCI_FREQ_KHZ  33000
     68
     69#define RTL8139_AUTONEG_CAPS (ETH_AUTONEG_10BASE_T_HALF | \
     70        ETH_AUTONEG_10BASE_T_FULL | ETH_AUTONEG_100BASE_TX_HALF | \
     71        ETH_AUTONEG_100BASE_TX_FULL | ETH_AUTONEG_PAUSE_SYMETRIC)
    6972
    7073/** Lock transmitter and receiver data
    71  *  This function shall be called whenever both transmitter and receiver locking
    72  *  to force safe lock ordering (deadlock prevention)
    73  *
    74  *  @param rtl8139  RTL8139 private data
     74 *
     75 * This function shall be called whenever
     76 * both transmitter and receiver locking
     77 * to force safe lock ordering (deadlock prevention)
     78 *
     79 * @param rtl8139 RTL8139 private data
     80 *
    7581 */
    7682inline static void rtl8139_lock_all(rtl8139_t *rtl8139)
     
    8389/** Unlock transmitter and receiver data
    8490 *
    85  *  @param rtl8139  RTL8139 private data
     91 * @param rtl8139 RTL8139 private data
     92 *
    8693 */
    8794inline static void rtl8139_unlock_all(rtl8139_t *rtl8139)
     
    152159}
    153160
    154 /** Update the mask of accepted packets in the RCR register according to
     161/** Update the mask of accepted frames in the RCR register according to
    155162 * rcr_accept_mode value in rtl8139_t
    156163 *
     
    170177}
    171178
    172 /** Fill the mask of accepted multicast packets in the card registers
     179/** Fill the mask of accepted multicast frames in the card registers
    173180 *
    174181 *  @param rtl8139  The rtl8139 private data
     
    394401#define rtl8139_tbuf_busy(tsd) ((pio_read_32(tsd) & TSD_OWN) == 0)
    395402
    396 /** Send packet with the hardware
     403/** Send frame with the hardware
    397404 *
    398405 * note: the main_lock is locked when framework calls this function
     
    412419        ddf_msg(LVL_DEBUG, "Sending frame");
    413420
    414         if (size > RTL8139_PACKET_MAX_LENGTH) {
     421        if (size > RTL8139_FRAME_MAX_LENGTH) {
    415422                ddf_msg(LVL_ERROR, "Send frame: frame too long, %zu bytes",
    416423                    size);
     
    437444        fibril_mutex_unlock(&rtl8139->tx_lock);
    438445
    439         /* Get address of the buffer descriptor and packet data */
     446        /* Get address of the buffer descriptor and frame data */
    440447        void *tsd = rtl8139->io_port + TSD0 + tx_curr * 4;
    441448        void *buf_addr = rtl8139->tx_buff[tx_curr];
     
    458465        pio_write_32(tsd, tsd_value);
    459466        return;
    460 
     467       
    461468err_busy_no_inc:
    462469err_size:
     
    505512}
    506513
    507 /** Create packet structure from the buffer data
     514/** Create frame structure from the buffer data
    508515 *
    509516 * @param nic_data      NIC driver data
    510517 * @param rx_buffer     The receiver buffer
    511518 * @param rx_size       The buffer size
    512  * @param packet_start  The offset where packet data start
    513  * @param packet_size   The size of the packet data
    514  *
    515  * @return The packet   list node (not connected)
    516  */
    517 static nic_frame_t *rtl8139_read_packet(nic_t *nic_data,
    518     void *rx_buffer, size_t rx_size, size_t packet_start, size_t packet_size)
    519 {
    520         nic_frame_t *frame = nic_alloc_frame(nic_data, packet_size);
     519 * @param frame_start   The offset where packet data start
     520 * @param frame_size    The size of the frame data
     521 *
     522 * @return The frame list node (not connected)
     523 *
     524 */
     525static nic_frame_t *rtl8139_read_frame(nic_t *nic_data,
     526    void *rx_buffer, size_t rx_size, size_t frame_start, size_t frame_size)
     527{
     528        nic_frame_t *frame = nic_alloc_frame(nic_data, frame_size);
    521529        if (! frame) {
    522                 ddf_msg(LVL_ERROR, "Can not allocate frame for received packet.");
     530                ddf_msg(LVL_ERROR, "Can not allocate frame for received frame.");
    523531                return NULL;
    524532        }
    525533
    526         void *packet_data = packet_suffix(frame->packet, packet_size);
    527         if (!packet_data) {
    528                 ddf_msg(LVL_ERROR, "Can not get the packet suffix.");
    529                 nic_release_frame(nic_data, frame);
    530                 return NULL;
    531         }
    532 
    533         void *ret = rtl8139_memcpy_wrapped(packet_data, rx_buffer, packet_start,
    534             RxBUF_SIZE, packet_size);
     534        void *ret = rtl8139_memcpy_wrapped(frame->data, rx_buffer, frame_start,
     535            RxBUF_SIZE, frame_size);
    535536        if (ret == NULL) {
    536537                nic_release_frame(nic_data, frame);
     
    568569}
    569570
    570 /** Receive all packets in queue
     571/** Receive all frames in queue
    571572 *
    572573 *  @param nic_data  The controller data
    573  *  @return The linked list of packet_list_t nodes, each containing one packet
    574  */
    575 static nic_frame_list_t *rtl8139_packet_receive(nic_t *nic_data)
     574 *  @return The linked list of nic_frame_list_t nodes, each containing one frame
     575 */
     576static nic_frame_list_t *rtl8139_frame_receive(nic_t *nic_data)
    576577{
    577578        rtl8139_t *rtl8139 = nic_get_specific(nic_data);
     
    581582        nic_frame_list_t *frames = nic_alloc_frame_list();
    582583        if (!frames)
    583                 ddf_msg(LVL_ERROR, "Can not allocate frame list for received packets.");
     584                ddf_msg(LVL_ERROR, "Can not allocate frame list for received frames.");
    584585
    585586        void *rx_buffer = rtl8139->rx_buff_virt;
     
    605606        while (!rtl8139_hw_buffer_empty(rtl8139)) {
    606607                void *rx_ptr = rx_buffer + rx_offset % RxBUF_SIZE;
    607                 uint32_t packet_header = uint32_t_le2host( *((uint32_t*)rx_ptr) );
    608                 uint16_t size = packet_header >> 16;
    609                 uint16_t packet_size = size - RTL8139_CRC_SIZE;
    610                 /* received packet flags in packet header */
    611                 uint16_t rcs = (uint16_t) packet_header;
     608                uint32_t frame_header = uint32_t_le2host( *((uint32_t*)rx_ptr) );
     609                uint16_t size = frame_header >> 16;
     610                uint16_t frame_size = size - RTL8139_CRC_SIZE;
     611                /* received frame flags in frame header */
     612                uint16_t rcs = (uint16_t) frame_header;
    612613
    613614                if (size == RTL8139_EARLY_SIZE) {
    614                         /* The packet copying is still in progress, break receiving */
     615                        /* The frame copying is still in progress, break receiving */
    615616                        ddf_msg(LVL_DEBUG, "Early threshold reached, not completely coppied");
    616617                        break;
     
    618619
    619620                /* Check if the header is valid, otherwise we are lost in the buffer */
    620                 if (size == 0 || size > RTL8139_PACKET_MAX_LENGTH) {
     621                if (size == 0 || size > RTL8139_FRAME_MAX_LENGTH) {
    621622                        ddf_msg(LVL_ERROR, "Receiver error -> receiver reset (size: %4"PRIu16", "
    622                             "header 0x%4"PRIx16". Offset: %zu)", size, packet_header,
     623                            "header 0x%4"PRIx16". Offset: %zu)", size, frame_header,
    623624                            rx_offset);
    624625                        goto rx_err;
     
    629630                }
    630631
    631                 cur_read += size + RTL_PACKET_HEADER_SIZE;
     632                cur_read += size + RTL_FRAME_HEADER_SIZE;
    632633                if (cur_read > max_read)
    633634                        break;
    634635
    635636                if (frames) {
    636                         nic_frame_t *frame = rtl8139_read_packet(nic_data, rx_buffer,
    637                             RxBUF_SIZE, rx_offset + RTL_PACKET_HEADER_SIZE, packet_size);
     637                        nic_frame_t *frame = rtl8139_read_frame(nic_data, rx_buffer,
     638                            RxBUF_SIZE, rx_offset + RTL_FRAME_HEADER_SIZE, frame_size);
    638639
    639640                        if (frame)
     
    642643
    643644                /* Update offset */
    644                 rx_offset = ALIGN_UP(rx_offset + size + RTL_PACKET_HEADER_SIZE, 4);
    645 
    646                 /* Write lesser value to prevent overflow into unread packet
     645                rx_offset = ALIGN_UP(rx_offset + size + RTL_FRAME_HEADER_SIZE, 4);
     646
     647                /* Write lesser value to prevent overflow into unread frame
    647648                 * (the recomendation from the RealTech rtl8139 programming guide)
    648649                 */
     
    660661
    661662
    662 irq_pio_range_t rtl8139_irq_pio_ranges[] = {
    663         {
    664                 .base = 0,
    665                 .size = RTL8139_IO_SIZE
    666         }
    667 };
    668663
    669664/** Commands to deal with interrupt
     
    675670 */
    676671irq_cmd_t rtl8139_irq_commands[] = {
    677         {
    678                 /* Get the interrupt status */
    679                 .cmd = CMD_PIO_READ_16,
    680                 .addr = NULL,
    681                 .dstarg = 2
    682         },
    683         {
    684                 .cmd = CMD_PREDICATE,
    685                 .value = 3,
    686                 .srcarg = 2
    687         },
    688         {
    689                 /* Mark interrupts as solved */
    690                 .cmd = CMD_PIO_WRITE_16,
    691                 .addr = NULL,
    692                 .value = 0xFFFF
    693         },
    694         {
    695                 /* Disable interrupts until interrupt routine is finished */
    696                 .cmd = CMD_PIO_WRITE_16,
    697                 .addr = NULL,
    698                 .value = 0x0000
    699         },
    700         {
    701                 .cmd = CMD_ACCEPT
    702         }
     672                {
     673                                /* Get the interrupt status */
     674                                .cmd = CMD_PIO_READ_16,
     675                                .addr = NULL,
     676                                .dstarg = 2
     677                },
     678                {
     679                                .cmd = CMD_PREDICATE,
     680                                .value = 3,
     681                                .srcarg = 2
     682                },
     683                {
     684                                /* Mark interrupts as solved */
     685                                .cmd = CMD_PIO_WRITE_16,
     686                                .addr = NULL,
     687                                .value = 0xFFFF
     688                },
     689                {
     690                                /* Disable interrupts until interrupt routine is finished */
     691                                .cmd = CMD_PIO_WRITE_16,
     692                                .addr = NULL,
     693                                .value = 0x0000
     694                },
     695                {
     696                                .cmd = CMD_ACCEPT
     697                }
    703698};
    704699
    705700/** Interrupt code definition */
    706701irq_code_t rtl8139_irq_code = {
    707         .rangecount = sizeof(rtl8139_irq_pio_ranges) / sizeof(irq_pio_range_t),
    708         .ranges = rtl8139_irq_pio_ranges,
    709         .cmdcount = sizeof(rtl8139_irq_commands) / sizeof(irq_cmd_t),
     702        .cmdcount = sizeof(rtl8139_irq_commands)/sizeof(irq_cmd_t),
    710703        .cmds = rtl8139_irq_commands
    711704};
     
    735728                tx_used++;
    736729
    737                 /* If the packet was sent */
     730                /* If the frame was sent */
    738731                if (tsd_value & TSD_TOK) {
    739732                        size_t size = REG_GET_VAL(tsd_value, TSD_SIZE);
     
    765758}
    766759
    767 /** Receive all packets from the buffer
     760/** Receive all frames from the buffer
    768761 *
    769762 *  @param rtl8139  driver private data
    770763 */
    771 static void rtl8139_receive_packets(nic_t *nic_data)
     764static void rtl8139_receive_frames(nic_t *nic_data)
    772765{
    773766        assert(nic_data);
     
    777770
    778771        fibril_mutex_lock(&rtl8139->rx_lock);
    779         nic_frame_list_t *frames = rtl8139_packet_receive(nic_data);
     772        nic_frame_list_t *frames = rtl8139_frame_receive(nic_data);
    780773        fibril_mutex_unlock(&rtl8139->rx_lock);
    781774
     
    833826        }
    834827
    835         /* Check transmittion interrupts first to allow transmit next packets
     828        /* Check transmittion interrupts first to allow transmit next frames
    836829         * sooner
    837830         */
     
    840833        }
    841834        if (isr & INT_ROK) {
    842                 rtl8139_receive_packets(nic_data);
     835                rtl8139_receive_frames(nic_data);
    843836        }
    844837        if (isr & (INT_RER | INT_RXOVW | INT_FIFOOVW)) {
     
    897890        RTL8139_IRQ_STRUCT_LOCK();
    898891
    899         rtl8139_irq_code.ranges[0].base = (uintptr_t) rtl8139->io_addr;
    900         rtl8139_irq_code.cmds[0].addr = rtl8139->io_addr + ISR;
    901         rtl8139_irq_code.cmds[2].addr = rtl8139->io_addr + ISR;
    902         rtl8139_irq_code.cmds[3].addr = rtl8139->io_addr + IMR;
     892        rtl8139_irq_code.cmds[0].addr = rtl8139->io_port + ISR;
     893        rtl8139_irq_code.cmds[2].addr = rtl8139->io_port + ISR;
     894        rtl8139_irq_code.cmds[3].addr = rtl8139->io_port + IMR;
    903895        int rc = register_interrupt_handler(nic_get_ddf_dev(nic_data),
    904             rtl8139->irq, rtl8139_interrupt_handler, &rtl8139_irq_code);
     896                rtl8139->irq, rtl8139_interrupt_handler, &rtl8139_irq_code);
    905897
    906898        RTL8139_IRQ_STRUCT_UNLOCK();
     
    942934}
    943935
    944 /** Activate the device to receive and transmit packets
     936/** Activate the device to receive and transmit frames
    945937 *
    946938 *  @param nic_data  The nic driver data
     
    12221214                goto failed;
    12231215
    1224         /* Set default packet acceptance */
     1216        /* Set default frame acceptance */
    12251217        rtl8139->rcr_data.ucast_mask = RTL8139_RCR_UCAST_DEFAULT;
    12261218        rtl8139->rcr_data.mcast_mask = RTL8139_RCR_MCAST_DEFAULT;
    12271219        rtl8139->rcr_data.bcast_mask = RTL8139_RCR_BCAST_DEFAULT;
    12281220        rtl8139->rcr_data.defect_mask = RTL8139_RCR_DEFECT_DEFAULT;
    1229         /* Set receiver early treshold to 8/16 of packet length */
     1221        /* Set receiver early treshold to 8/16 of frame length */
    12301222        rtl8139->rcr_data.rcr_base = (0x8 << RCR_ERTH_SHIFT);
    12311223
    12321224        ddf_msg(LVL_DEBUG, "The device is initialized");
    12331225        return ret;
    1234 
     1226       
    12351227failed:
    12361228        ddf_msg(LVL_ERROR, "The device initialization failed");
     
    12971289int rtl8139_dev_add(ddf_dev_t *dev)
    12981290{
     1291        ddf_fun_t *fun;
     1292
    12991293        assert(dev);
    13001294        ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %d)", dev->name, dev->handle);
     
    13331327        }
    13341328
    1335         rc = nic_register_as_ddf_fun(nic_data, &rtl8139_dev_ops);
     1329        fun = ddf_fun_create(nic_get_ddf_dev(nic_data), fun_exposed, "port0");
     1330        if (fun == NULL) {
     1331                ddf_msg(LVL_ERROR, "Failed creating device function");
     1332                goto err_srv;
     1333        }
     1334        nic_set_ddf_fun(nic_data, fun);
     1335        fun->ops = &rtl8139_dev_ops;
     1336        fun->driver_data = nic_data;
     1337
     1338        rc = ddf_fun_bind(fun);
    13361339        if (rc != EOK) {
    1337                 ddf_msg(LVL_ERROR, "Failed to register as DDF function - error %d", rc);
    1338                 goto err_irq;
     1340                ddf_msg(LVL_ERROR, "Failed binding device function");
     1341                goto err_fun_create;
     1342        }
     1343        rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC);
     1344        if (rc != EOK) {
     1345                ddf_msg(LVL_ERROR, "Failed adding function to category");
     1346                goto err_fun_bind;
    13391347        }
    13401348
     
    13431351
    13441352        return EOK;
    1345 
     1353       
     1354err_fun_bind:
     1355        ddf_fun_unbind(fun);
     1356err_fun_create:
     1357        ddf_fun_destroy(fun);
     1358err_srv:
     1359        /* XXX Disconnect from services */
    13461360err_irq:
    13471361        unregister_interrupt_handler(dev, rtl8139->irq);
     
    14861500};
    14871501
    1488 /** Check if pause packet operations are valid in current situation
     1502/** Check if pause frame operations are valid in current situation
    14891503 *
    14901504 *  @param rtl8139  RTL8139 private structure
     
    15111525}
    15121526
    1513 /** Get current pause packet configuration
     1527/** Get current pause frame configuration
    15141528 *
    15151529 *  Values are filled with NIC_RESULT_NOT_AVAILABLE if the value has no sense in
     
    15171531 *
    15181532 *  @param[in]  fun         The DDF structure of the RTL8139
    1519  *  @param[out] we_send     Sign if local constroller sends pause packets
    1520  *  @param[out] we_receive  Sign if local constroller receives pause packets
    1521  *  @param[out] time        Time filled in pause packets. 0xFFFF in rtl8139
     1533 *  @param[out] we_send     Sign if local constroller sends pause frame
     1534 *  @param[out] we_receive  Sign if local constroller receives pause frame
     1535 *  @param[out] time        Time filled in pause frames. 0xFFFF in rtl8139
    15221536 *
    15231537 *  @return EOK if succeed
     
    15491563};
    15501564
    1551 /** Set current pause packet configuration
     1565/** Set current pause frame configuration
    15521566 *
    15531567 *  @param fun            The DDF structure of the RTL8139
    1554  *  @param allow_send     Sign if local constroller sends pause packets
    1555  *  @param allow_receive  Sign if local constroller receives pause packets
     1568 *  @param allow_send     Sign if local constroller sends pause frame
     1569 *  @param allow_receive  Sign if local constroller receives pause frames
    15561570 *  @param time           Time to use, ignored (not supported by device)
    15571571 *
    1558  *  @return EOK if succeed, INVAL if the pause packet has no sence
     1572 *  @return EOK if succeed, INVAL if the pause frame has no sence
    15591573 */
    15601574static int rtl8139_pause_set(ddf_fun_t *fun, int allow_send, int allow_receive,
     
    18051819}
    18061820
    1807 /** Set unicast packets acceptance mode
     1821/** Set unicast frames acceptance mode
    18081822 *
    18091823 *  @param nic_data  The nic device to update
     
    18631877}
    18641878
    1865 /** Set multicast packets acceptance mode
     1879/** Set multicast frames acceptance mode
    18661880 *
    18671881 *  @param nic_data  The nic device to update
     
    19081922}
    19091923
    1910 /** Set broadcast packets acceptance mode
     1924/** Set broadcast frames acceptance mode
    19111925 *
    19121926 *  @param nic_data  The nic device to update
     
    19381952}
    19391953
    1940 /** Get state of acceptance of weird packets
     1954/** Get state of acceptance of weird frames
    19411955 *
    19421956 *  @param[in]  device  The device to check
     
    19601974};
    19611975
    1962 /** Set acceptance of weird packets
     1976/** Set acceptance of weird frames
    19631977 *
    19641978 *  @param device  The device to update
     
    21362150}
    21372151
    2138 /** Force receiving all packets in the receive buffer
     2152/** Force receiving all frames in the receive buffer
    21392153 *
    21402154 *  @param device  The device to receive
Note: See TracChangeset for help on using the changeset viewer.