Commit f2a9797b authored by Chunfeng Yun's avatar Chunfeng Yun Committed by Greg Kroah-Hartman

Revert "usb: xhci-mtk: Do not use xhci's virt_dev in drop_endpoint"

I find the patch introduce some issues, e.g.
1. oops happens when xhci_gen_setup() failed, and hash is not init
   but try to destroy it;
2. memory leakage happens when fail to insert ep, need free sch_ep,
   or insert ep after insert int list;
3. memory leakage happens when fail to allocate sch_array, need destroy
   rhashtable;
4. it's better to check ep->hcpriv when drop ep;

so prefer to revert this patch, and resend it after the issues are fixed.

This reverts commit b8731209.

Cc: Ikjoon Jang <ikjn@chromium.org>
Signed-off-by: default avatarChunfeng Yun <chunfeng.yun@mediatek.com>
Link: https://lore.kernel.org/r/20210820065913.64490-2-chunfeng.yun@mediatek.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 76d55a63
This diff is collapsed.
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#define _XHCI_MTK_H_ #define _XHCI_MTK_H_
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/rhashtable.h>
#include "xhci.h" #include "xhci.h"
...@@ -26,34 +25,36 @@ ...@@ -26,34 +25,36 @@
/** /**
* @fs_bus_bw: array to keep track of bandwidth already used for FS * @fs_bus_bw: array to keep track of bandwidth already used for FS
* @nr_eps: number of endpoints using this TT * @ep_list: Endpoints using this TT
*/ */
struct mu3h_sch_tt { struct mu3h_sch_tt {
u32 fs_bus_bw[XHCI_MTK_MAX_ESIT]; u32 fs_bus_bw[XHCI_MTK_MAX_ESIT];
int nr_eps; struct list_head ep_list;
}; };
/** /**
* struct mu3h_sch_bw_info: schedule information for bandwidth domain * struct mu3h_sch_bw_info: schedule information for bandwidth domain
* *
* @bus_bw: array to keep track of bandwidth already used at each uframes * @bus_bw: array to keep track of bandwidth already used at each uframes
* @bw_ep_list: eps in the bandwidth domain
* *
* treat a HS root port as a bandwidth domain, but treat a SS root port as * treat a HS root port as a bandwidth domain, but treat a SS root port as
* two bandwidth domains, one for IN eps and another for OUT eps. * two bandwidth domains, one for IN eps and another for OUT eps.
*/ */
struct mu3h_sch_bw_info { struct mu3h_sch_bw_info {
u32 bus_bw[XHCI_MTK_MAX_ESIT]; u32 bus_bw[XHCI_MTK_MAX_ESIT];
struct list_head bw_ep_list;
}; };
/** /**
* struct mu3h_sch_ep_info: schedule information for endpoint * struct mu3h_sch_ep_info: schedule information for endpoint
* *
* @bw_info: bandwidth domain which this endpoint belongs
* @esit: unit is 125us, equal to 2 << Interval field in ep-context * @esit: unit is 125us, equal to 2 << Interval field in ep-context
* @num_budget_microframes: number of continuous uframes * @num_budget_microframes: number of continuous uframes
* (@repeat==1) scheduled within the interval * (@repeat==1) scheduled within the interval
* @bw_cost_per_microframe: bandwidth cost per microframe * @bw_cost_per_microframe: bandwidth cost per microframe
* @endpoint: linked into bw_ep_chk_list, used by check_bandwidth hook * @endpoint: linked into bandwidth domain which it belongs to
* @tt_endpoint: linked into mu3h_sch_tt's list which it belongs to
* @sch_tt: mu3h_sch_tt linked into * @sch_tt: mu3h_sch_tt linked into
* @ep_type: endpoint type * @ep_type: endpoint type
* @maxpkt: max packet size of endpoint * @maxpkt: max packet size of endpoint
...@@ -81,12 +82,11 @@ struct mu3h_sch_ep_info { ...@@ -81,12 +82,11 @@ struct mu3h_sch_ep_info {
u32 num_budget_microframes; u32 num_budget_microframes;
u32 bw_cost_per_microframe; u32 bw_cost_per_microframe;
struct list_head endpoint; struct list_head endpoint;
struct mu3h_sch_bw_info *bw_info; struct list_head tt_endpoint;
struct mu3h_sch_tt *sch_tt; struct mu3h_sch_tt *sch_tt;
u32 ep_type; u32 ep_type;
u32 maxpkt; u32 maxpkt;
struct usb_host_endpoint *ep; struct usb_host_endpoint *ep;
struct rhash_head ep_link;
enum usb_device_speed speed; enum usb_device_speed speed;
bool allocated; bool allocated;
/* /*
...@@ -134,7 +134,6 @@ struct xhci_hcd_mtk { ...@@ -134,7 +134,6 @@ struct xhci_hcd_mtk {
struct device *dev; struct device *dev;
struct usb_hcd *hcd; struct usb_hcd *hcd;
struct mu3h_sch_bw_info *sch_array; struct mu3h_sch_bw_info *sch_array;
struct rhashtable sch_ep_table;
struct list_head bw_ep_chk_list; struct list_head bw_ep_chk_list;
struct mu3c_ippc_regs __iomem *ippc_regs; struct mu3c_ippc_regs __iomem *ippc_regs;
int num_u2_ports; int num_u2_ports;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment