Changeset 7943c43 in mainline for uspace/drv/nic/rtl8139/driver.c


Ignore:
Timestamp:
2012-01-16T22:45:38Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
32817cc, 3fe58d3c
Parents:
9117ef9b (diff), 3ea725e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    r9117ef9b r7943c43  
    3333#include <libarch/ddi.h>
    3434#include <libarch/barrier.h>
    35 #include <nlog.h>
    36 
    37 #include <dma.h>
     35
     36#include <as.h>
     37#include <ddf/log.h>
    3838#include <ddf/interrupt.h>
    39 #include <devman.h>
     39#include <io/log.h>
    4040#include <nic.h>
    4141#include <packet_client.h>
     
    5050#include <str.h>
    5151
    52 #include "rtl8139_defs.h"
    53 #include "rtl8139_driver.h"
    54 #include "rtl8139_general.h"
     52#include "defs.h"
     53#include "driver.h"
     54#include "general.h"
    5555
    5656/** Global mutex for work with shared irq structure */
     
    164164            (RXBUF_SIZE_FLAGS << RCR_RBLEN_SHIFT);
    165165       
    166         nlog_debug("Rewriting rcr: %x -> %x", pio_read_32(rtl8139->io_port + RCR),
     166        ddf_msg(LVL_DEBUG, "Rewriting rcr: %x -> %x", pio_read_32(rtl8139->io_port + RCR),
    167167            rcr);
    168168
     
    373373static ddf_dev_ops_t rtl8139_dev_ops;
    374374
    375 static int rtl8139_add_device(ddf_dev_t *dev);
     375static int rtl8139_dev_add(ddf_dev_t *dev);
    376376
    377377/** Basic driver operations for RTL8139 driver */
    378378static driver_ops_t rtl8139_driver_ops = {
    379         .add_device = &rtl8139_add_device,
     379        .dev_add = &rtl8139_dev_add,
    380380};
    381381
     
    389389static int rtl8139_on_activated(nic_t *nic_data);
    390390static int rtl8139_on_stopped(nic_t *nic_data);
    391 static void rtl8139_write_packet(nic_t *nic_data, packet_t *packet);
     391static void rtl8139_send_frame(nic_t *nic_data, void *data, size_t size);
    392392
    393393/** Check if the transmit buffer is busy */
     
    399399 *
    400400 * @param nic_data  The nic driver data structure
    401  * @param packet    The packet to send
     401 * @param data      Frame data
     402 * @param size      Frame size in bytes
    402403 *
    403404 * @return EOK if succeed, error code in the case of error
    404405 */
    405 static void rtl8139_write_packet(nic_t *nic_data, packet_t *packet)
     406static void rtl8139_send_frame(nic_t *nic_data, void *data, size_t size)
    406407{
    407408        assert(nic_data);
     
    409410        rtl8139_t *rtl8139 = nic_get_specific(nic_data);
    410411        assert(rtl8139);
    411         nlog_debug("Sending packet");
    412 
    413         /* Get the packet data and check if it can be send */
    414         size_t packet_length = packet_get_data_length(packet);
    415         void *packet_data = packet_get_data(packet);
    416 
    417         assert(packet_data);
    418 
    419         if ((packet_length > RTL8139_PACKET_MAX_LENGTH) || !packet_data) {
    420                 nlog_error("Write packet length error: data %p, length %z",
    421                     packet_data, packet_length);
     412        ddf_msg(LVL_DEBUG, "Sending frame");
     413
     414        if (size > RTL8139_PACKET_MAX_LENGTH) {
     415                ddf_msg(LVL_ERROR, "Send frame: frame too long, %zu bytes",
     416                    size);
    422417                nic_report_send_error(rtl8139->nic_data, NIC_SEC_OTHER, 1);
    423418                goto err_size;
    424419        }
    425420
    426         assert((packet_length & TSD_SIZE_MASK) == packet_length);
     421        assert((size & TSD_SIZE_MASK) == size);
    427422
    428423        /* Lock transmitter structure for obtaining next buffer */
     
    449444        assert(!rtl8139_tbuf_busy(tsd));
    450445
    451         /* Write packet data to the buffer, set the size to TSD and clear OWN bit */
    452         memcpy(buf_addr, packet_data, packet_length);
     446        /* Write frame data to the buffer, set the size to TSD and clear OWN bit */
     447        memcpy(buf_addr, data, size);
    453448
    454449        /* Set size of the data to send */
    455450        uint32_t tsd_value = pio_read_32(tsd);
    456         tsd_value = rtl8139_tsd_set_size(tsd_value, packet_length);
     451        tsd_value = rtl8139_tsd_set_size(tsd_value, size);
    457452        pio_write_32(tsd, tsd_value);
    458453
     
    462457        tsd_value &= ~(uint32_t)TSD_OWN;
    463458        pio_write_32(tsd, tsd_value);
    464         nic_release_packet(nic_data, packet);
    465459        return;
    466460
    467461err_busy_no_inc:
    468462err_size:
    469         nic_release_packet(nic_data, packet);
    470463        return;
    471464};
     
    527520        nic_frame_t *frame = nic_alloc_frame(nic_data, packet_size);
    528521        if (! frame) {
    529                 nlog_error("Can not allocate frame for received packet.");
     522                ddf_msg(LVL_ERROR, "Can not allocate frame for received packet.");
    530523                return NULL;
    531524        }
     
    533526        void *packet_data = packet_suffix(frame->packet, packet_size);
    534527        if (!packet_data) {
    535                 nlog_error("Can not get the packet suffix.");
     528                ddf_msg(LVL_ERROR, "Can not get the packet suffix.");
    536529                nic_release_frame(nic_data, frame);
    537530                return NULL;
     
    564557        pio_write_32(rtl8139->io_port + CAPR, 0);
    565558        pio_write_32(rtl8139->io_port + RBSTART,
    566             PTR2U32(rtl8139->rx_buff.physical));
     559            PTR2U32(rtl8139->rx_buff_phys));
    567560
    568561        write_barrier();
     
    588581        nic_frame_list_t *frames = nic_alloc_frame_list();
    589582        if (!frames)
    590                 nlog_error("Can not allocate frame list for received packets.");
    591 
    592         void *rx_buffer = rtl8139->rx_buff.virtual;
     583                ddf_msg(LVL_ERROR, "Can not allocate frame list for received packets.");
     584
     585        void *rx_buffer = rtl8139->rx_buff_virt;
    593586
    594587        /* where to start reading */
     
    620613                if (size == RTL8139_EARLY_SIZE) {
    621614                        /* The packet copying is still in progress, break receiving */
    622                         nlog_debug("Early threshold reached, not completely coppied");
     615                        ddf_msg(LVL_DEBUG, "Early threshold reached, not completely coppied");
    623616                        break;
    624617                }
     
    626619                /* Check if the header is valid, otherwise we are lost in the buffer */
    627620                if (size == 0 || size > RTL8139_PACKET_MAX_LENGTH) {
    628                         nlog_error("Receiver error -> receiver reset (size: %4"PRIu16", "
     621                        ddf_msg(LVL_ERROR, "Receiver error -> receiver reset (size: %4"PRIu16", "
    629622                            "header 0x%4"PRIx16". Offset: %zu)", size, packet_header,
    630623                            rx_offset);
     
    632625                }
    633626                if (size < RTL8139_RUNT_MAX_SIZE && !(rcs & RSR_RUNT)) {
    634                         nlog_error("Receiver error -> receiver reset (%"PRIx16")", size);
     627                        ddf_msg(LVL_ERROR, "Receiver error -> receiver reset (%"PRIx16")", size);
    635628                        goto rx_err;
    636629                }
     
    801794        pio_write_32(rtl8139->io_port + TIMERINT, timer_val);
    802795        pio_write_32(rtl8139->io_port + TCTR, 0x0);
    803         nlog_debug("rtl8139 timer: %"PRIu32"\treceive: %d", timer_val, receive);
     796        ddf_msg(LVL_DEBUG, "rtl8139 timer: %"PRIu32"\treceive: %d", timer_val, receive);
    804797        return receive;
    805798}
     
    925918        /* Write transmittion buffer addresses */
    926919        for(i = 0; i < TX_BUFF_COUNT; ++i) {
    927                 uint32_t addr = PTR2U32(rtl8139->tx_buff_mem.physical + i*TX_BUFF_SIZE);
     920                uint32_t addr = PTR2U32(rtl8139->tx_buff_phys + i*TX_BUFF_SIZE);
    928921                pio_write_32(io_base + TSAD0 + 4*i, addr);
    929922        }
     
    932925        nic_set_tx_busy(rtl8139->nic_data, 0);
    933926
    934         pio_write_32(io_base + RBSTART, PTR2U32(rtl8139->rx_buff.physical));
     927        pio_write_32(io_base + RBSTART, PTR2U32(rtl8139->rx_buff_phys));
    935928
    936929        /* Enable transmitter and receiver */
     
    949942{
    950943        assert(nic_data);
    951         nlog_info("Activating device");
     944        ddf_msg(LVL_NOTE, "Activating device");
    952945
    953946        rtl8139_t *rtl8139 = nic_get_specific(nic_data);
     
    962955        nic_enable_interrupt(nic_data, rtl8139->irq);
    963956
    964         nlog_debug("Device activated, interrupt %d registered", rtl8139->irq);
     957        ddf_msg(LVL_DEBUG, "Device activated, interrupt %d registered", rtl8139->irq);
    965958        return EOK;
    966959}
     
    10221015        rtl8139->nic_data = nic_data;
    10231016        nic_set_specific(nic_data, rtl8139);
    1024         nic_set_write_packet_handler(nic_data, rtl8139_write_packet);
     1017        nic_set_send_frame_handler(nic_data, rtl8139_send_frame);
    10251018        nic_set_state_change_handlers(nic_data,
    10261019                rtl8139_on_activated, NULL, rtl8139_on_stopped);
     
    10791072
    10801073        if (hw_resources->irqs.count != 1) {
    1081                 nlog_error("%s device: unexpected irq count", dev->name);
     1074                ddf_msg(LVL_ERROR, "%s device: unexpected irq count", dev->name);
    10821075                return EINVAL;
    10831076        };
    10841077        if (hw_resources->io_ranges.count != 1) {
    1085                 nlog_error("%s device: unexpected io ranges count", dev->name);
     1078                ddf_msg(LVL_ERROR, "%s device: unexpected io ranges count", dev->name);
    10861079                return EINVAL;
    10871080        }
    10881081
    10891082        rtl8139->irq = hw_resources->irqs.irqs[0];
    1090         nlog_debug("%s device: irq 0x%x assigned", dev->name, rtl8139->irq);
     1083        ddf_msg(LVL_DEBUG, "%s device: irq 0x%x assigned", dev->name, rtl8139->irq);
    10911084
    10921085        rtl8139->io_addr = IOADDR_TO_PTR(hw_resources->io_ranges.ranges[0].address);
    10931086        if (hw_resources->io_ranges.ranges[0].size < RTL8139_IO_SIZE) {
    1094                 nlog_error("i/o range assigned to the device "
     1087                ddf_msg(LVL_ERROR, "i/o range assigned to the device "
    10951088                    "%s is too small.", dev->name);
    10961089                return EINVAL;
    10971090        }
    1098         nlog_debug("%s device: i/o addr %p assigned.", dev->name, rtl8139->io_addr);
     1091        ddf_msg(LVL_DEBUG, "%s device: i/o addr %p assigned.", dev->name, rtl8139->io_addr);
    10991092
    11001093        return EOK;
     
    11421135static int rtl8139_buffers_create(rtl8139_t *rtl8139)
    11431136{
    1144         assert(rtl8139);
    11451137        size_t i = 0;
    11461138        int rc;
    11471139
    1148         nlog_debug("Creating buffers");
    1149 
    1150         rtl8139->tx_buff_mem.size = TX_PAGES;
    1151         rtl8139->tx_buff_mem.mapping_flags = AS_AREA_WRITE;
    1152         rc = dma_allocate_anonymous(&rtl8139->tx_buff_mem, DMA_32_BITS);
     1140        ddf_msg(LVL_DEBUG, "Creating buffers");
     1141
     1142        rc = dmamem_map_anonymous(TX_PAGES * PAGE_SIZE, AS_AREA_WRITE, 0,
     1143            &rtl8139->tx_buff_phys, &rtl8139->tx_buff_virt);
    11531144        if (rc != EOK) {
    1154                 nlog_error("Can not allocate transmitter buffers.");
     1145                ddf_msg(LVL_ERROR, "Can not allocate transmitter buffers.");
    11551146                goto err_tx_alloc;
    11561147        }
    11571148
    1158         for(i = 0; i < TX_BUFF_COUNT; ++i)
    1159                 rtl8139->tx_buff[i] = rtl8139->tx_buff_mem.virtual + i * TX_BUFF_SIZE;
    1160 
    1161         nlog_debug("The transmittion buffers allocated");
     1149        for (i = 0; i < TX_BUFF_COUNT; ++i)
     1150                rtl8139->tx_buff[i] = rtl8139->tx_buff_virt + i * TX_BUFF_SIZE;
     1151
     1152        ddf_msg(LVL_DEBUG, "The transmittion buffers allocated");
    11621153
    11631154        /* Use the first buffer for next transmittion */
     
    11661157
    11671158        /* Allocate buffer for receiver */
    1168         size_t rx_pages = ALIGN_UP(RxBUF_TOT_LENGTH, PAGE_SIZE) / PAGE_SIZE;
    1169         nlog_debug("Allocating receiver buffer of the size %zd pages", rx_pages);
    1170 
    1171         rtl8139->rx_buff.size = rx_pages;
    1172         rtl8139->rx_buff.mapping_flags = AS_AREA_READ;
    1173         rc = dma_allocate_anonymous(&rtl8139->rx_buff, DMA_32_BITS);
    1174         if( rc != EOK ) {
    1175                 nlog_error("Can not allocate receiver buffer.");
     1159        ddf_msg(LVL_DEBUG, "Allocating receiver buffer of the size %zu bytes",
     1160            RxBUF_TOT_LENGTH);
     1161
     1162        rc = dmamem_map_anonymous(RxBUF_TOT_LENGTH, AS_AREA_READ, 0,
     1163            &rtl8139->rx_buff_phys, &rtl8139->rx_buff_virt);
     1164        if (rc != EOK) {
     1165                ddf_msg(LVL_ERROR, "Can not allocate receive buffer.");
    11761166                goto err_rx_alloc;
    11771167        }
    1178         nlog_debug("The buffers created");
     1168        ddf_msg(LVL_DEBUG, "The buffers created");
    11791169
    11801170        return EOK;
    11811171
    11821172err_rx_alloc:
    1183         dma_free(&rtl8139->tx_buff_mem);
     1173        dmamem_unmap_anonymous(&rtl8139->tx_buff_virt);
    11841174err_tx_alloc:
    11851175        return rc;
     
    11941184static int rtl8139_device_initialize(ddf_dev_t *dev)
    11951185{
    1196         nlog_debug("rtl8139_dev_initialize %s", dev->name);
     1186        ddf_msg(LVL_DEBUG, "rtl8139_dev_initialize %s", dev->name);
    11971187
    11981188        int ret = EOK;
    11991189
    1200         nlog_debug("rtl8139: creating device data");
     1190        ddf_msg(LVL_DEBUG, "rtl8139: creating device data");
    12011191
    12021192        /* Allocate driver data for the device. */
    12031193        rtl8139_t *rtl8139 = rtl8139_create_dev_data(dev);
    12041194        if (rtl8139 == NULL) {
    1205                 nlog_error("Not enough memory for initializing %s.", dev->name);
     1195                ddf_msg(LVL_ERROR, "Not enough memory for initializing %s.", dev->name);
    12061196                return ENOMEM;
    12071197        }
    12081198
    1209         nlog_debug("rtl8139: dev_data created");
     1199        ddf_msg(LVL_DEBUG, "rtl8139: dev_data created");
    12101200
    12111201        /* Obtain and fill hardware resources info and connect to parent */
    12121202        ret = rtl8139_get_resource_info(dev);
    12131203        if (ret != EOK) {
    1214                 nlog_error("Can not obatin hw resources information");
     1204                ddf_msg(LVL_ERROR, "Can not obatin hw resources information");
    12151205                goto failed;
    12161206        }
    12171207
    1218         nlog_debug("rtl8139: resource_info obtained");
     1208        ddf_msg(LVL_DEBUG, "rtl8139: resource_info obtained");
    12191209
    12201210        /* Allocate DMA buffers */
     
    12311221        rtl8139->rcr_data.rcr_base = (0x8 << RCR_ERTH_SHIFT);
    12321222
    1233         nlog_debug("The device is initialized");
     1223        ddf_msg(LVL_DEBUG, "The device is initialized");
    12341224        return ret;
    12351225
    12361226failed:
    1237         nlog_error("The device initialization failed");
     1227        ddf_msg(LVL_ERROR, "The device initialization failed");
    12381228        rtl8139_dev_cleanup(dev);
    12391229        return ret;
     
    12481238static int rtl8139_pio_enable(ddf_dev_t *dev)
    12491239{
    1250         nlog_debug(NAME ": rtl8139_pio_enable %s", dev->name);
     1240        ddf_msg(LVL_DEBUG, NAME ": rtl8139_pio_enable %s", dev->name);
    12511241
    12521242        rtl8139_t *rtl8139 = nic_get_specific(nic_get_from_ddf_dev(dev));
     
    12541244        /* Gain control over port's registers. */
    12551245        if (pio_enable(rtl8139->io_addr, RTL8139_IO_SIZE, &rtl8139->io_port)) {
    1256                 nlog_error("Cannot gain the port %lx for device %s.", rtl8139->io_addr,
     1246                ddf_msg(LVL_ERROR, "Cannot gain the port %lx for device %s.", rtl8139->io_addr,
    12571247                    dev->name);
    12581248                return EADDRNOTAVAIL;
     
    12821272                if (rtl8139_versions[i].hwverid == hwverid) {
    12831273                        rtl8139->hw_version = rtl8139_versions[i].ver_id;
    1284                         nlog_info("HW version found: index %zu, ver_id %d (%s)", i,
     1274                        ddf_msg(LVL_NOTE, "HW version found: index %zu, ver_id %d (%s)", i,
    12851275                            rtl8139_versions[i].ver_id, model_names[rtl8139->hw_version]);
    12861276                }
     
    12961286 * @return EOK if added successfully, negative error code otherwise
    12971287 */
    1298 int rtl8139_add_device(ddf_dev_t *dev)
     1288int rtl8139_dev_add(ddf_dev_t *dev)
    12991289{
    13001290        assert(dev);
    1301         nlog_info("RTL8139_add_device %s (handle = %d)", dev->name, dev->handle);
     1291        ddf_msg(LVL_NOTE, "RTL8139_dev_add %s (handle = %d)", dev->name, dev->handle);
    13021292
    13031293        /* Init device structure for rtl8139 */
     
    13301320        rc = nic_connect_to_services(nic_data);
    13311321        if (rc != EOK) {
    1332                 nlog_error("Failed to connect to services", rc);
     1322                ddf_msg(LVL_ERROR, "Failed to connect to services", rc);
    13331323                goto err_irq;
    13341324        }
     
    13361326        rc = nic_register_as_ddf_fun(nic_data, &rtl8139_dev_ops);
    13371327        if (rc != EOK) {
    1338                 nlog_error("Failed to register as DDF function - error %d", rc);
     1328                ddf_msg(LVL_ERROR, "Failed to register as DDF function - error %d", rc);
    13391329                goto err_irq;
    13401330        }
    13411331
    1342         nlog_info("The %s device has been successfully initialized.",
     1332        ddf_msg(LVL_NOTE, "The %s device has been successfully initialized.",
    13431333            dev->name);
    13441334
     
    15811571
    15821572        if (allow_send && time > 0) {
    1583                 nlog_warning("Time setting is not supported in set_pause method.");
     1573                ddf_msg(LVL_WARN, "Time setting is not supported in set_pause method.");
    15841574        }
    15851575        return EOK;
     
    21212111                pio_write_32(rtl8139->io_port + TCTR, 0);
    21222112
    2123                 nlog_debug("Periodic mode. Interrupt mask %"PRIx16", poll.full_skips %"
     2113                ddf_msg(LVL_DEBUG, "Periodic mode. Interrupt mask %"PRIx16", poll.full_skips %"
    21242114                    PRIu32", last timer %"PRIu32".", rtl8139->int_mask,
    21252115                    rtl8139->poll_timer.full_skips, rtl8139->poll_timer.last_val);
     
    21682158                &rtl8139_driver_ops, &rtl8139_dev_ops, &rtl8139_nic_iface);
    21692159
    2170         nlog_set_min_severity(DEBUG);
    2171         nlog_info("HelenOS RTL8139 driver started");
     2160        ddf_log_init(NAME, LVL_ERROR);
     2161        ddf_msg(LVL_NOTE, "HelenOS RTL8139 driver started");
    21722162        return ddf_driver_main(&rtl8139_driver);
    21732163}
Note: See TracChangeset for help on using the changeset viewer.