From 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 07:44:59 +0000 Subject: [PATCH] gmac get mac form eeprom --- kernel/drivers/staging/octeon-usb/octeon-hcd.c | 81 ++++++++++++++++++++-------------------- 1 files changed, 40 insertions(+), 41 deletions(-) diff --git a/kernel/drivers/staging/octeon-usb/octeon-hcd.c b/kernel/drivers/staging/octeon-usb/octeon-hcd.c index cff5e79..e2f8b6b 100644 --- a/kernel/drivers/staging/octeon-usb/octeon-hcd.c +++ b/kernel/drivers/staging/octeon-usb/octeon-hcd.c @@ -50,6 +50,7 @@ #include <linux/module.h> #include <linux/usb/hcd.h> #include <linux/prefetch.h> +#include <linux/dma-mapping.h> #include <linux/platform_device.h> #include <asm/octeon/octeon.h> @@ -377,29 +378,6 @@ struct cvmx_usb_tx_fifo nonperiodic; }; -/* This macro spins on a register waiting for it to reach a condition. */ -#define CVMX_WAIT_FOR_FIELD32(address, _union, cond, timeout_usec) \ - ({int result; \ - do { \ - u64 done = cvmx_get_cycle() + (u64)timeout_usec * \ - octeon_get_clock_rate() / 1000000; \ - union _union c; \ - \ - while (1) { \ - c.u32 = cvmx_usb_read_csr32(usb, address); \ - \ - if (cond) { \ - result = 0; \ - break; \ - } else if (cvmx_get_cycle() > done) { \ - result = -1; \ - break; \ - } else \ - __delay(100); \ - } \ - } while (0); \ - result; }) - /* * This macro logically sets a single field in a CSR. It does the sequence * read, modify, and write @@ -428,7 +406,7 @@ */ struct octeon_temp_buffer { void *orig_buffer; - u8 data[0]; + u8 data[]; }; static inline struct usb_hcd *octeon_to_hcd(struct octeon_hcd *p) @@ -543,8 +521,7 @@ */ static inline u32 cvmx_usb_read_csr32(struct octeon_hcd *usb, u64 address) { - u32 result = cvmx_read64_uint32(address ^ 4); - return result; + return cvmx_read64_uint32(address ^ 4); } /** @@ -593,6 +570,33 @@ return 0; /* Data0 */ } +/* Loops through register until txfflsh or rxfflsh become zero.*/ +static int cvmx_wait_tx_rx(struct octeon_hcd *usb, int fflsh_type) +{ + int result; + u64 address = CVMX_USBCX_GRSTCTL(usb->index); + u64 done = cvmx_get_cycle() + 100 * + (u64)octeon_get_clock_rate / 1000000; + union cvmx_usbcx_grstctl c; + + while (1) { + c.u32 = cvmx_usb_read_csr32(usb, address); + if (fflsh_type == 0 && c.s.txfflsh == 0) { + result = 0; + break; + } else if (fflsh_type == 1 && c.s.rxfflsh == 0) { + result = 0; + break; + } else if (cvmx_get_cycle() > done) { + result = -1; + break; + } + + __delay(100); + } + return result; +} + static void cvmx_fifo_setup(struct octeon_hcd *usb) { union cvmx_usbcx_ghwcfg3 usbcx_ghwcfg3; @@ -634,12 +638,10 @@ cvmx_usbcx_grstctl, txfnum, 0x10); USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), cvmx_usbcx_grstctl, txfflsh, 1); - CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), - cvmx_usbcx_grstctl, c.s.txfflsh == 0, 100); + cvmx_wait_tx_rx(usb, 0); USB_SET_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), cvmx_usbcx_grstctl, rxfflsh, 1); - CVMX_WAIT_FOR_FIELD32(CVMX_USBCX_GRSTCTL(usb->index), - cvmx_usbcx_grstctl, c.s.rxfflsh == 0, 100); + cvmx_wait_tx_rx(usb, 1); } /** @@ -1231,8 +1233,7 @@ cvmx_write64_uint32(csr_address, *ptr++); cvmx_write64_uint32(csr_address, *ptr++); cvmx_write64_uint32(csr_address, *ptr++); - cvmx_read64_uint64( - CVMX_USBNX_DMA0_INB_CHN0(usb->index)); + cvmx_read64_uint64(CVMX_USBNX_DMA0_INB_CHN0(usb->index)); words -= 3; } cvmx_write64_uint32(csr_address, *ptr++); @@ -1834,8 +1835,7 @@ * * Returns: Pipe or NULL if none are ready */ -static struct cvmx_usb_pipe *cvmx_usb_find_ready_pipe( - struct octeon_hcd *usb, +static struct cvmx_usb_pipe *cvmx_usb_find_ready_pipe(struct octeon_hcd *usb, enum cvmx_usb_transfer xfer_type) { struct list_head *list = usb->active_pipes + xfer_type; @@ -2382,13 +2382,11 @@ */ static int cvmx_usb_get_frame_number(struct octeon_hcd *usb) { - int frame_number; union cvmx_usbcx_hfnum usbc_hfnum; usbc_hfnum.u32 = cvmx_usb_read_csr32(usb, CVMX_USBCX_HFNUM(usb->index)); - frame_number = usbc_hfnum.s.frnum; - return frame_number; + return usbc_hfnum.s.frnum; } static void cvmx_usb_transfer_control(struct octeon_hcd *usb, @@ -2768,7 +2766,7 @@ (pipe->transfer_dir == CVMX_USB_DIRECTION_OUT)) pipe->flags |= CVMX_USB_PIPE_FLAGS_NEED_PING; - if (unlikely(WARN_ON_ONCE(bytes_this_transfer < 0))) { + if (WARN_ON_ONCE(bytes_this_transfer < 0)) { /* * In some rare cases the DMA engine seems to get stuck and * keeps substracting same byte count over and over again. In @@ -3512,7 +3510,7 @@ .product_desc = "Octeon Host Controller", .hcd_priv_size = sizeof(struct octeon_hcd), .irq = octeon_usb_irq, - .flags = HCD_MEMORY | HCD_USB2, + .flags = HCD_MEMORY | HCD_DMA | HCD_USB2, .start = octeon_usb_start, .stop = octeon_usb_stop, .urb_enqueue = octeon_usb_urb_enqueue, @@ -3604,8 +3602,9 @@ * Set the DMA mask to 64bits so we get buffers already translated for * DMA. */ - dev->coherent_dma_mask = ~0; - dev->dma_mask = &dev->coherent_dma_mask; + i = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(64)); + if (i) + return i; /* * Only cn52XX and cn56XX have DWC_OTG USB hardware and the -- Gitblit v1.6.2