/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
/* 
 | 
 * softing common interfaces 
 | 
 * 
 | 
 * by Kurt Van Dijck, 2008-2010 
 | 
 */ 
 | 
  
 | 
#include <linux/atomic.h> 
 | 
#include <linux/netdevice.h> 
 | 
#include <linux/ktime.h> 
 | 
#include <linux/mutex.h> 
 | 
#include <linux/spinlock.h> 
 | 
#include <linux/can.h> 
 | 
#include <linux/can/dev.h> 
 | 
  
 | 
#include "softing_platform.h" 
 | 
  
 | 
struct softing; 
 | 
  
 | 
struct softing_priv { 
 | 
    struct can_priv can; /* must be the first member! */ 
 | 
    struct net_device *netdev; 
 | 
    struct softing *card; 
 | 
    struct { 
 | 
        int pending; 
 | 
        /* variables which hold the circular buffer */ 
 | 
        int echo_put; 
 | 
        int echo_get; 
 | 
    } tx; 
 | 
    struct can_bittiming_const btr_const; 
 | 
    int index; 
 | 
    uint8_t output; 
 | 
    uint16_t chip; 
 | 
}; 
 | 
#define netdev2softing(netdev)    ((struct softing_priv *)netdev_priv(netdev)) 
 | 
  
 | 
struct softing { 
 | 
    const struct softing_platform_data *pdat; 
 | 
    struct platform_device *pdev; 
 | 
    struct net_device *net[2]; 
 | 
    spinlock_t spin; /* protect this structure & DPRAM access */ 
 | 
    ktime_t ts_ref; 
 | 
    ktime_t ts_overflow; /* timestamp overflow value, in ktime */ 
 | 
  
 | 
    struct { 
 | 
        /* indication of firmware status */ 
 | 
        int up; 
 | 
        /* protection of the 'up' variable */ 
 | 
        struct mutex lock; 
 | 
    } fw; 
 | 
    struct { 
 | 
        int nr; 
 | 
        int requested; 
 | 
        int svc_count; 
 | 
        unsigned int dpram_position; 
 | 
    } irq; 
 | 
    struct { 
 | 
        int pending; 
 | 
        int last_bus; 
 | 
        /* 
 | 
         * keep the bus that last tx'd a message, 
 | 
         * in order to let every netdev queue resume 
 | 
         */ 
 | 
    } tx; 
 | 
    __iomem uint8_t *dpram; 
 | 
    unsigned long dpram_phys; 
 | 
    unsigned long dpram_size; 
 | 
    struct { 
 | 
        uint16_t fw_version, hw_version, license, serial; 
 | 
        uint16_t chip[2]; 
 | 
        unsigned int freq; /* remote cpu's operating frequency */ 
 | 
    } id; 
 | 
}; 
 | 
  
 | 
int softing_default_output(struct net_device *netdev); 
 | 
  
 | 
ktime_t softing_raw2ktime(struct softing *card, u32 raw); 
 | 
  
 | 
int softing_chip_poweron(struct softing *card); 
 | 
  
 | 
int softing_bootloader_command(struct softing *card, int16_t cmd, 
 | 
                   const char *msg); 
 | 
  
 | 
/* Load firmware after reset */ 
 | 
int softing_load_fw(const char *file, struct softing *card, 
 | 
            __iomem uint8_t *virt, unsigned int size, int offset); 
 | 
  
 | 
/* Load final application firmware after bootloader */ 
 | 
int softing_load_app_fw(const char *file, struct softing *card); 
 | 
  
 | 
/* 
 | 
 * enable or disable irq 
 | 
 * only called with fw.lock locked 
 | 
 */ 
 | 
int softing_enable_irq(struct softing *card, int enable); 
 | 
  
 | 
/* start/stop 1 bus on card */ 
 | 
int softing_startstop(struct net_device *netdev, int up); 
 | 
  
 | 
/* netif_rx() */ 
 | 
int softing_netdev_rx(struct net_device *netdev, const struct can_frame *msg, 
 | 
              ktime_t ktime); 
 | 
  
 | 
/* SOFTING DPRAM mappings */ 
 | 
#define DPRAM_RX        0x0000 
 | 
    #define DPRAM_RX_SIZE    32 
 | 
    #define DPRAM_RX_CNT    16 
 | 
#define DPRAM_RX_RD        0x0201    /* uint8_t */ 
 | 
#define DPRAM_RX_WR        0x0205    /* uint8_t */ 
 | 
#define DPRAM_RX_LOST        0x0207    /* uint8_t */ 
 | 
  
 | 
#define DPRAM_FCT_PARAM        0x0300    /* int16_t [20] */ 
 | 
#define DPRAM_FCT_RESULT    0x0328    /* int16_t */ 
 | 
#define DPRAM_FCT_HOST        0x032b    /* uint16_t */ 
 | 
  
 | 
#define DPRAM_INFO_BUSSTATE    0x0331    /* uint16_t */ 
 | 
#define DPRAM_INFO_BUSSTATE2    0x0335    /* uint16_t */ 
 | 
#define DPRAM_INFO_ERRSTATE    0x0339    /* uint16_t */ 
 | 
#define DPRAM_INFO_ERRSTATE2    0x033d    /* uint16_t */ 
 | 
#define DPRAM_RESET        0x0341    /* uint16_t */ 
 | 
#define DPRAM_CLR_RECV_FIFO    0x0345    /* uint16_t */ 
 | 
#define DPRAM_RESET_TIME    0x034d    /* uint16_t */ 
 | 
#define DPRAM_TIME        0x0350    /* uint64_t */ 
 | 
#define DPRAM_WR_START        0x0358    /* uint8_t */ 
 | 
#define DPRAM_WR_END        0x0359    /* uint8_t */ 
 | 
#define DPRAM_RESET_RX_FIFO    0x0361    /* uint16_t */ 
 | 
#define DPRAM_RESET_TX_FIFO    0x0364    /* uint8_t */ 
 | 
#define DPRAM_READ_FIFO_LEVEL    0x0365    /* uint8_t */ 
 | 
#define DPRAM_RX_FIFO_LEVEL    0x0366    /* uint16_t */ 
 | 
#define DPRAM_TX_FIFO_LEVEL    0x0366    /* uint16_t */ 
 | 
  
 | 
#define DPRAM_TX        0x0400    /* uint16_t */ 
 | 
    #define DPRAM_TX_SIZE    16 
 | 
    #define DPRAM_TX_CNT    32 
 | 
#define DPRAM_TX_RD        0x0601    /* uint8_t */ 
 | 
#define DPRAM_TX_WR        0x0605    /* uint8_t */ 
 | 
  
 | 
#define DPRAM_COMMAND        0x07e0    /* uint16_t */ 
 | 
#define DPRAM_RECEIPT        0x07f0    /* uint16_t */ 
 | 
#define DPRAM_IRQ_TOHOST    0x07fe    /* uint8_t */ 
 | 
#define DPRAM_IRQ_TOCARD    0x07ff    /* uint8_t */ 
 | 
  
 | 
#define DPRAM_V2_RESET        0x0e00    /* uint8_t */ 
 | 
#define DPRAM_V2_IRQ_TOHOST    0x0e02    /* uint8_t */ 
 | 
  
 | 
#define TXMAX    (DPRAM_TX_CNT - 1) 
 | 
  
 | 
/* DPRAM return codes */ 
 | 
#define RES_NONE    0 
 | 
#define RES_OK        1 
 | 
#define RES_NOK        2 
 | 
#define RES_UNKNOWN    3 
 | 
/* DPRAM flags */ 
 | 
#define CMD_TX        0x01 
 | 
#define CMD_ACK        0x02 
 | 
#define CMD_XTD        0x04 
 | 
#define CMD_RTR        0x08 
 | 
#define CMD_ERR        0x10 
 | 
#define CMD_BUS2    0x80 
 | 
  
 | 
/* returned fifo entry bus state masks */ 
 | 
#define SF_MASK_BUSOFF        0x80 
 | 
#define SF_MASK_EPASSIVE    0x60 
 | 
  
 | 
/* bus states */ 
 | 
#define STATE_BUSOFF    2 
 | 
#define STATE_EPASSIVE    1 
 | 
#define STATE_EACTIVE    0 
 |