Ignore:
File:
1 edited

Legend:

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

    r5cd3d67 r6d8455d  
    3939#include <io/log.h>
    4040#include <nic.h>
     41#include <packet_client.h>
    4142#include <device/pci.h>
    4243
     
    5556/** Global mutex for work with shared irq structure */
    5657FIBRIL_MUTEX_INITIALIZE(irq_reg_lock);
    57 
    5858/** Lock interrupt structure mutex */
    59 #define RTL8139_IRQ_STRUCT_LOCK() \
    60         fibril_mutex_lock(&irq_reg_lock)
    61 
     59#define RTL8139_IRQ_STRUCT_LOCK() fibril_mutex_lock(&irq_reg_lock)
    6260/** Unlock interrupt structure mutex */
    63 #define RTL8139_IRQ_STRUCT_UNLOCK() \
    64         fibril_mutex_unlock(&irq_reg_lock)
     61#define RTL8139_IRQ_STRUCT_UNLOCK() fibril_mutex_unlock(&irq_reg_lock)
    6562
    6663/** PCI clock frequency in kHz */
    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)
     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)
    7269
    7370/** Lock transmitter and receiver 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  *
     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
    8175 */
    8276inline static void rtl8139_lock_all(rtl8139_t *rtl8139)
     
    8983/** Unlock transmitter and receiver data
    9084 *
    91  * @param rtl8139 RTL8139 private data
    92  *
     85 *  @param rtl8139  RTL8139 private data
    9386 */
    9487inline static void rtl8139_unlock_all(rtl8139_t *rtl8139)
     
    159152}
    160153
    161 /** Update the mask of accepted frames in the RCR register according to
     154/** Update the mask of accepted packets in the RCR register according to
    162155 * rcr_accept_mode value in rtl8139_t
    163156 *
     
    177170}
    178171
    179 /** Fill the mask of accepted multicast frames in the card registers
     172/** Fill the mask of accepted multicast packets in the card registers
    180173 *
    181174 *  @param rtl8139  The rtl8139 private data
     
    401394#define rtl8139_tbuf_busy(tsd) ((pio_read_32(tsd) & TSD_OWN) == 0)
    402395
    403 /** Send frame with the hardware
     396/** Send packet with the hardware
    404397 *
    405398 * note: the main_lock is locked when framework calls this function
     
    419412        ddf_msg(LVL_DEBUG, "Sending frame");
    420413
    421         if (size > RTL8139_FRAME_MAX_LENGTH) {
     414        if (size > RTL8139_PACKET_MAX_LENGTH) {
    422415                ddf_msg(LVL_ERROR, "Send frame: frame too long, %zu bytes",
    423416                    size);
     
    444437        fibril_mutex_unlock(&rtl8139->tx_lock);
    445438
    446         /* Get address of the buffer descriptor and frame data */
     439        /* Get address of the buffer descriptor and packet data */
    447440        void *tsd = rtl8139->io_port + TSD0 + tx_curr * 4;
    448441        void *buf_addr = rtl8139->tx_buff[tx_curr];
     
    465458        pio_write_32(tsd, tsd_value);
    466459        return;
    467        
     460
    468461err_busy_no_inc:
    469462err_size:
     
    512505}
    513506
    514 /** Create frame structure from the buffer data
     507/** Create packet structure from the buffer data
    515508 *
    516509 * @param nic_data      NIC driver data
    517510 * @param rx_buffer     The receiver buffer
    518511 * @param rx_size       The buffer 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  */
    525 static 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);
     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 */
     517static 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);
    529521        if (! frame) {
    530                 ddf_msg(LVL_ERROR, "Can not allocate frame for received frame.");
     522                ddf_msg(LVL_ERROR, "Can not allocate frame for received packet.");
    531523                return NULL;
    532524        }
    533525
    534         void *ret = rtl8139_memcpy_wrapped(frame->data, rx_buffer, frame_start,
    535             RxBUF_SIZE, frame_size);
     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);
    536535        if (ret == NULL) {
    537536                nic_release_frame(nic_data, frame);
     
    569568}
    570569
    571 /** Receive all frames in queue
     570/** Receive all packets in queue
    572571 *
    573572 *  @param nic_data  The controller data
    574  *  @return The linked list of nic_frame_list_t nodes, each containing one frame
    575  */
    576 static nic_frame_list_t *rtl8139_frame_receive(nic_t *nic_data)
     573 *  @return The linked list of packet_list_t nodes, each containing one packet
     574 */
     575static nic_frame_list_t *rtl8139_packet_receive(nic_t *nic_data)
    577576{
    578577        rtl8139_t *rtl8139 = nic_get_specific(nic_data);
     
    582581        nic_frame_list_t *frames = nic_alloc_frame_list();
    583582        if (!frames)
    584                 ddf_msg(LVL_ERROR, "Can not allocate frame list for received frames.");
     583                ddf_msg(LVL_ERROR, "Can not allocate frame list for received packets.");
    585584
    586585        void *rx_buffer = rtl8139->rx_buff_virt;
     
    606605        while (!rtl8139_hw_buffer_empty(rtl8139)) {
    607606                void *rx_ptr = rx_buffer + rx_offset % RxBUF_SIZE;
    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;
     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;
    613612
    614613                if (size == RTL8139_EARLY_SIZE) {
    615                         /* The frame copying is still in progress, break receiving */
     614                        /* The packet copying is still in progress, break receiving */
    616615                        ddf_msg(LVL_DEBUG, "Early threshold reached, not completely coppied");
    617616                        break;
     
    619618
    620619                /* Check if the header is valid, otherwise we are lost in the buffer */
    621                 if (size == 0 || size > RTL8139_FRAME_MAX_LENGTH) {
     620                if (size == 0 || size > RTL8139_PACKET_MAX_LENGTH) {
    622621                        ddf_msg(LVL_ERROR, "Receiver error -> receiver reset (size: %4"PRIu16", "
    623                             "header 0x%4"PRIx16". Offset: %zu)", size, frame_header,
     622                            "header 0x%4"PRIx16". Offset: %zu)", size, packet_header,
    624623                            rx_offset);
    625624                        goto rx_err;
     
    630629                }
    631630
    632                 cur_read += size + RTL_FRAME_HEADER_SIZE;
     631                cur_read += size + RTL_PACKET_HEADER_SIZE;
    633632                if (cur_read > max_read)
    634633                        break;
    635634
    636635                if (frames) {
    637                         nic_frame_t *frame = rtl8139_read_frame(nic_data, rx_buffer,
    638                             RxBUF_SIZE, rx_offset + RTL_FRAME_HEADER_SIZE, frame_size);
     636                        nic_frame_t *frame = rtl8139_read_packet(nic_data, rx_buffer,
     637                            RxBUF_SIZE, rx_offset + RTL_PACKET_HEADER_SIZE, packet_size);
    639638
    640639                        if (frame)
     
    643642
    644643                /* Update offset */
    645                 rx_offset = ALIGN_UP(rx_offset + size + RTL_FRAME_HEADER_SIZE, 4);
    646 
    647                 /* Write lesser value to prevent overflow into unread frame
     644                rx_offset = ALIGN_UP(rx_offset + size + RTL_PACKET_HEADER_SIZE, 4);
     645
     646                /* Write lesser value to prevent overflow into unread packet
    648647                 * (the recomendation from the RealTech rtl8139 programming guide)
    649648                 */
     
    728727                tx_used++;
    729728
    730                 /* If the frame was sent */
     729                /* If the packet was sent */
    731730                if (tsd_value & TSD_TOK) {
    732731                        size_t size = REG_GET_VAL(tsd_value, TSD_SIZE);
     
    758757}
    759758
    760 /** Receive all frames from the buffer
     759/** Receive all packets from the buffer
    761760 *
    762761 *  @param rtl8139  driver private data
    763762 */
    764 static void rtl8139_receive_frames(nic_t *nic_data)
     763static void rtl8139_receive_packets(nic_t *nic_data)
    765764{
    766765        assert(nic_data);
     
    770769
    771770        fibril_mutex_lock(&rtl8139->rx_lock);
    772         nic_frame_list_t *frames = rtl8139_frame_receive(nic_data);
     771        nic_frame_list_t *frames = rtl8139_packet_receive(nic_data);
    773772        fibril_mutex_unlock(&rtl8139->rx_lock);
    774773
     
    826825        }
    827826
    828         /* Check transmittion interrupts first to allow transmit next frames
     827        /* Check transmittion interrupts first to allow transmit next packets
    829828         * sooner
    830829         */
     
    833832        }
    834833        if (isr & INT_ROK) {
    835                 rtl8139_receive_frames(nic_data);
     834                rtl8139_receive_packets(nic_data);
    836835        }
    837836        if (isr & (INT_RER | INT_RXOVW | INT_FIFOOVW)) {
     
    934933}
    935934
    936 /** Activate the device to receive and transmit frames
     935/** Activate the device to receive and transmit packets
    937936 *
    938937 *  @param nic_data  The nic driver data
     
    12141213                goto failed;
    12151214
    1216         /* Set default frame acceptance */
     1215        /* Set default packet acceptance */
    12171216        rtl8139->rcr_data.ucast_mask = RTL8139_RCR_UCAST_DEFAULT;
    12181217        rtl8139->rcr_data.mcast_mask = RTL8139_RCR_MCAST_DEFAULT;
    12191218        rtl8139->rcr_data.bcast_mask = RTL8139_RCR_BCAST_DEFAULT;
    12201219        rtl8139->rcr_data.defect_mask = RTL8139_RCR_DEFECT_DEFAULT;
    1221         /* Set receiver early treshold to 8/16 of frame length */
     1220        /* Set receiver early treshold to 8/16 of packet length */
    12221221        rtl8139->rcr_data.rcr_base = (0x8 << RCR_ERTH_SHIFT);
    12231222
    12241223        ddf_msg(LVL_DEBUG, "The device is initialized");
    12251224        return ret;
    1226        
     1225
    12271226failed:
    12281227        ddf_msg(LVL_ERROR, "The device initialization failed");
     
    12891288int rtl8139_dev_add(ddf_dev_t *dev)
    12901289{
    1291         ddf_fun_t *fun;
    1292 
    12931290        assert(dev);
    12941291        ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %d)", dev->name, dev->handle);
     
    13271324        }
    13281325
    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);
     1326        rc = nic_register_as_ddf_fun(nic_data, &rtl8139_dev_ops);
    13391327        if (rc != EOK) {
    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;
     1328                ddf_msg(LVL_ERROR, "Failed to register as DDF function - error %d", rc);
     1329                goto err_irq;
    13471330        }
    13481331
     
    13511334
    13521335        return EOK;
    1353        
    1354 err_fun_bind:
    1355         ddf_fun_unbind(fun);
    1356 err_fun_create:
    1357         ddf_fun_destroy(fun);
    1358 err_srv:
    1359         /* XXX Disconnect from services */
     1336
    13601337err_irq:
    13611338        unregister_interrupt_handler(dev, rtl8139->irq);
     
    15001477};
    15011478
    1502 /** Check if pause frame operations are valid in current situation
     1479/** Check if pause packet operations are valid in current situation
    15031480 *
    15041481 *  @param rtl8139  RTL8139 private structure
     
    15251502}
    15261503
    1527 /** Get current pause frame configuration
     1504/** Get current pause packet configuration
    15281505 *
    15291506 *  Values are filled with NIC_RESULT_NOT_AVAILABLE if the value has no sense in
     
    15311508 *
    15321509 *  @param[in]  fun         The DDF structure of the 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
     1510 *  @param[out] we_send     Sign if local constroller sends pause packets
     1511 *  @param[out] we_receive  Sign if local constroller receives pause packets
     1512 *  @param[out] time        Time filled in pause packets. 0xFFFF in rtl8139
    15361513 *
    15371514 *  @return EOK if succeed
     
    15631540};
    15641541
    1565 /** Set current pause frame configuration
     1542/** Set current pause packet configuration
    15661543 *
    15671544 *  @param fun            The DDF structure of the RTL8139
    1568  *  @param allow_send     Sign if local constroller sends pause frame
    1569  *  @param allow_receive  Sign if local constroller receives pause frames
     1545 *  @param allow_send     Sign if local constroller sends pause packets
     1546 *  @param allow_receive  Sign if local constroller receives pause packets
    15701547 *  @param time           Time to use, ignored (not supported by device)
    15711548 *
    1572  *  @return EOK if succeed, INVAL if the pause frame has no sence
     1549 *  @return EOK if succeed, INVAL if the pause packet has no sence
    15731550 */
    15741551static int rtl8139_pause_set(ddf_fun_t *fun, int allow_send, int allow_receive,
     
    18191796}
    18201797
    1821 /** Set unicast frames acceptance mode
     1798/** Set unicast packets acceptance mode
    18221799 *
    18231800 *  @param nic_data  The nic device to update
     
    18771854}
    18781855
    1879 /** Set multicast frames acceptance mode
     1856/** Set multicast packets acceptance mode
    18801857 *
    18811858 *  @param nic_data  The nic device to update
     
    19221899}
    19231900
    1924 /** Set broadcast frames acceptance mode
     1901/** Set broadcast packets acceptance mode
    19251902 *
    19261903 *  @param nic_data  The nic device to update
     
    19521929}
    19531930
    1954 /** Get state of acceptance of weird frames
     1931/** Get state of acceptance of weird packets
    19551932 *
    19561933 *  @param[in]  device  The device to check
     
    19741951};
    19751952
    1976 /** Set acceptance of weird frames
     1953/** Set acceptance of weird packets
    19771954 *
    19781955 *  @param device  The device to update
     
    21502127}
    21512128
    2152 /** Force receiving all frames in the receive buffer
     2129/** Force receiving all packets in the receive buffer
    21532130 *
    21542131 *  @param device  The device to receive
Note: See TracChangeset for help on using the changeset viewer.