Ignore:
File:
1 edited

Legend:

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

    rfafb8e5 r870841cf  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2014 Agnieszka Tabaka
    34 * All rights reserved.
     
    7475static errno_t rtl8169_on_stopped(nic_t *nic_data);
    7576static void rtl8169_send_frame(nic_t *nic_data, void *data, size_t size);
    76 static void rtl8169_irq_handler(ipc_call_t *icall, ddf_dev_t *dev);
     77static void rtl8169_irq_handler(ipc_call_t *icall, void *);
    7778static inline errno_t rtl8169_register_int_handler(nic_t *nic_data,
    7879    cap_irq_handle_t *handle);
     
    164165
    165166static errno_t rtl8169_dev_add(ddf_dev_t *dev);
     167static errno_t rtl8169_dev_quiesce(ddf_dev_t *dev);
    166168
    167169/** Basic driver operations for RTL8169 driver */
    168170static driver_ops_t rtl8169_driver_ops = {
    169171        .dev_add = &rtl8169_dev_add,
     172        .dev_quiesce = &rtl8169_dev_quiesce
    170173};
    171174
     
    362365}
    363366
    364 inline static errno_t rtl8169_register_int_handler(nic_t *nic_data,
     367static errno_t rtl8169_register_int_handler(nic_t *nic_data,
    365368    cap_irq_handle_t *handle)
    366369{
     
    372375        rtl8169_irq_code.cmds[3].addr = rtl8169->regs + IMR;
    373376        errno_t rc = register_interrupt_handler(nic_get_ddf_dev(nic_data),
    374             rtl8169->irq, rtl8169_irq_handler, &rtl8169_irq_code, handle);
     377            rtl8169->irq, rtl8169_irq_handler, (void *)rtl8169,
     378            &rtl8169_irq_code, handle);
    375379
    376380        return rc;
     
    483487}
    484488
     489static errno_t rtl8169_dev_quiesce(ddf_dev_t *dev)
     490{
     491        nic_t *nic;
     492        rtl8169_t *rtl8169;
     493
     494        ddf_msg(LVL_NOTE, "RTL8169_dev_quiesce %s (handle = %zu)",
     495            ddf_dev_get_name(dev), ddf_dev_get_handle(dev));
     496
     497        nic = nic_get_from_ddf_dev(dev);
     498        rtl8169 = nic_get_specific(nic);
     499
     500        /* Reset card */
     501        pio_write_8(rtl8169->regs + CONFIG0, 0);
     502        rtl8169_reset(rtl8169);
     503
     504        return EOK;
     505}
     506
    485507static errno_t rtl8169_set_addr(ddf_fun_t *fun, const nic_address_t *addr)
    486508{
     
    761783}
    762784
    763 inline static void rtl8169_reset(rtl8169_t *rtl8169)
     785static void rtl8169_reset(rtl8169_t *rtl8169)
    764786{
    765787        pio_write_8(rtl8169->regs + CR, CR_RST);
     
    806828 *  @param was_promisc  Sign if the promiscuous mode was active before disabling
    807829 */
    808 inline static void rtl8169_rcx_promics_rem(nic_t *nic_data,
     830static void rtl8169_rcx_promics_rem(nic_t *nic_data,
    809831    nic_multicast_mode_t mcast_mode, uint8_t was_promisc)
    810832{
     
    10331055}
    10341056
    1035 static void rtl8169_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
    1036 {
    1037         assert(dev);
    1038         assert(icall);
    1039 
     1057/** RTL8169 IRQ handler.
     1058 *
     1059 * @param icall IRQ event notification
     1060 * @param arg Argument (rtl8169_t *)
     1061 */
     1062static void rtl8169_irq_handler(ipc_call_t *icall, void *arg)
     1063{
    10401064        uint16_t isr = (uint16_t) ipc_get_arg2(icall) & INT_KNOWN;
    1041         nic_t *nic_data = nic_get_from_ddf_dev(dev);
    1042         rtl8169_t *rtl8169 = nic_get_specific(nic_data);
     1065        rtl8169_t *rtl8169 = (rtl8169_t *)arg;
    10431066
    10441067        ddf_msg(LVL_DEBUG, "rtl8169_irq_handler(): isr=0x%04x", isr);
     
    10501073                /* Packet underrun or link change */
    10511074                if (isr & INT_PUN) {
    1052                         rtl8169_link_change(dev);
     1075                        rtl8169_link_change(rtl8169->dev);
    10531076                        pio_write_16(rtl8169->regs + ISR, INT_PUN);
    10541077                }
     
    10561079                /* Transmit notification */
    10571080                if (isr & (INT_TER | INT_TOK | INT_TDU)) {
    1058                         rtl8169_transmit_done(dev);
     1081                        rtl8169_transmit_done(rtl8169->dev);
    10591082                        pio_write_16(rtl8169->regs + ISR, (INT_TER | INT_TOK | INT_TDU));
    10601083                }
     
    10721095
    10731096                if (isr & (INT_RER | INT_ROK)) {
    1074                         rtl8169_receive_done(dev);
     1097                        rtl8169_receive_done(rtl8169->dev);
    10751098                        pio_write_16(rtl8169->regs + ISR, (INT_RER | INT_ROK));
    10761099                }
Note: See TracChangeset for help on using the changeset viewer.