support kernel 6.1 plus some clean up
This commit is contained in:
parent
6a2916db1a
commit
73a681a0db
@ -1,6 +1,6 @@
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
#### Click [here](https://github.com/morrownr/USB-WiFi) for USB WiFi Adapter Information for Linux
|
#### [Go to Main Menu](https://github.com/morrownr/USB-WiFi)
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ sudo uname -mr; mokutil --sb-state; lsusb; rfkill list all; dkms status; iw dev;
|
|||||||
### Compatible Kernels
|
### Compatible Kernels
|
||||||
|
|
||||||
- Kernels: 4.19 - 5.11 (Realtek)
|
- Kernels: 4.19 - 5.11 (Realtek)
|
||||||
- Kernels: 5.12 - 6.0 (community support)
|
- Kernels: 5.12 - 6.1 (community support)
|
||||||
|
|
||||||
### Tested Linux Distributions
|
### Tested Linux Distributions
|
||||||
|
|
||||||
@ -160,7 +160,6 @@ installing the new kernel. Use the following commands in the driver directory:
|
|||||||
```
|
```
|
||||||
$ git pull
|
$ git pull
|
||||||
$ sudo ./remove-driver.sh
|
$ sudo ./remove-driver.sh
|
||||||
(install the new kernel)
|
|
||||||
$ sudo ./install-driver.sh
|
$ sudo ./install-driver.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -411,7 +410,7 @@ the process each time a new kernel is installed in your distro.
|
|||||||
### Driver Options ( edit-options.sh )
|
### Driver Options ( edit-options.sh )
|
||||||
|
|
||||||
A file called `88x2bu.conf` will be installed in `/etc/modprobe.d` by
|
A file called `88x2bu.conf` will be installed in `/etc/modprobe.d` by
|
||||||
default if you use one of the scripts for installation.
|
default if you use the `./install-driver.sh` script.
|
||||||
|
|
||||||
Note: The installation script will prompt you to edit the options.
|
Note: The installation script will prompt you to edit the options.
|
||||||
|
|
||||||
|
@ -4,4 +4,3 @@ MAKE[0]="'make' -j$(nproc) KVER=${kernelver} KSRC=/lib/modules/${kernelver}/buil
|
|||||||
CLEAN="'make' clean"
|
CLEAN="'make' clean"
|
||||||
BUILT_MODULE_NAME[0]="88x2bu"
|
BUILT_MODULE_NAME[0]="88x2bu"
|
||||||
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/wireless"
|
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/wireless"
|
||||||
AUTOINSTALL="yes"
|
|
||||||
|
@ -8,10 +8,6 @@ SCRIPT_NAME="install-driver.sh"
|
|||||||
SCRIPT_VERSION="20221007"
|
SCRIPT_VERSION="20221007"
|
||||||
OPTIONS_FILE="88x2bu.conf"
|
OPTIONS_FILE="88x2bu.conf"
|
||||||
|
|
||||||
# Some distros have a non-mainlined, patched-in kernel driver
|
|
||||||
# that has to be deactivated.
|
|
||||||
BLACKLIST_FILE="rtw88_8822bu.conf"
|
|
||||||
|
|
||||||
MODULE_NAME="88x2bu"
|
MODULE_NAME="88x2bu"
|
||||||
KVER="$(uname -r)"
|
KVER="$(uname -r)"
|
||||||
MODDESTDIR="/lib/modules/${KVER}/kernel/drivers/net/wireless/"
|
MODDESTDIR="/lib/modules/${KVER}/kernel/drivers/net/wireless/"
|
||||||
@ -20,6 +16,10 @@ DRV_NAME="rtl88x2bu"
|
|||||||
DRV_VERSION="5.13.1"
|
DRV_VERSION="5.13.1"
|
||||||
DRV_DIR="$(pwd)"
|
DRV_DIR="$(pwd)"
|
||||||
|
|
||||||
|
# Some distros have non-mainlined, patched-in kernel drivers
|
||||||
|
# that have to be deactivated.
|
||||||
|
BLACKLIST_FILE="rtw88_8822bu.conf"
|
||||||
|
|
||||||
# check to ensure sudo was used
|
# check to ensure sudo was used
|
||||||
if [[ $EUID -ne 0 ]]
|
if [[ $EUID -ne 0 ]]
|
||||||
then
|
then
|
||||||
@ -63,6 +63,7 @@ fi
|
|||||||
uname -r
|
uname -r
|
||||||
# architecture - for ARM: aarch64 = 64 bit, armv7l = 32 bit
|
# architecture - for ARM: aarch64 = 64 bit, armv7l = 32 bit
|
||||||
uname -m
|
uname -m
|
||||||
|
#getconf LONG_BIT (may be handy in the future)
|
||||||
|
|
||||||
echo "Starting installation..."
|
echo "Starting installation..."
|
||||||
|
|
||||||
@ -122,6 +123,10 @@ else
|
|||||||
dkms add -m ${DRV_NAME} -v ${DRV_VERSION}
|
dkms add -m ${DRV_NAME} -v ${DRV_VERSION}
|
||||||
RESULT=$?
|
RESULT=$?
|
||||||
|
|
||||||
|
# RESULT will be 3 if the DKMS tree already contains the same module/version
|
||||||
|
# combo. You cannot add the same module/version combo more than once.
|
||||||
|
# I need to add logic to handle this.
|
||||||
|
|
||||||
if [[ "$RESULT" != "0" ]]
|
if [[ "$RESULT" != "0" ]]
|
||||||
then
|
then
|
||||||
echo "An error occurred. dkms add error = ${RESULT}"
|
echo "An error occurred. dkms add error = ${RESULT}"
|
||||||
|
@ -446,7 +446,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset,
|
|||||||
u8 ret = _SUCCESS;
|
u8 ret = _SUCCESS;
|
||||||
|
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
|
||||||
struct cfg80211_chan_def chdef;
|
struct cfg80211_chan_def chdef = {};
|
||||||
|
|
||||||
ret = rtw_chbw_to_cfg80211_chan_def(wiphy, &chdef, ch, bw, offset, ht);
|
ret = rtw_chbw_to_cfg80211_chan_def(wiphy, &chdef, ch, bw, offset, ht);
|
||||||
if (ret != _SUCCESS)
|
if (ret != _SUCCESS)
|
||||||
@ -456,7 +456,7 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset,
|
|||||||
if (started) {
|
if (started) {
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) || defined(RHEL8))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) || defined(RHEL8))
|
||||||
|
|
||||||
/* --- cfg80211_ch_switch_started_notify() ---
|
/* --- cfg80211_ch_switch_started_notfiy() ---
|
||||||
* A new parameter, bool quiet, is added from Linux kernel v5.11,
|
* A new parameter, bool quiet, is added from Linux kernel v5.11,
|
||||||
* to see if block-tx was requested by the AP. since currently,
|
* to see if block-tx was requested by the AP. since currently,
|
||||||
* the API is used for station before connected in rtw_chk_start_clnt_join()
|
* the API is used for station before connected in rtw_chk_start_clnt_join()
|
||||||
@ -464,7 +464,11 @@ u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset,
|
|||||||
* called by others with block-tx.
|
* called by others with block-tx.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, 0, false);
|
||||||
|
#else
|
||||||
cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, false);
|
cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0, false);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0);
|
cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0);
|
||||||
#endif
|
#endif
|
||||||
@ -1911,6 +1915,9 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev
|
static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
, int link_id
|
||||||
|
#endif
|
||||||
, u8 key_index
|
, u8 key_index
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||||
, bool pairwise
|
, bool pairwise
|
||||||
@ -2073,6 +2080,9 @@ addkey_end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev
|
static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
, int link_id
|
||||||
|
#endif
|
||||||
, u8 keyid
|
, u8 keyid
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||||
, bool pairwise
|
, bool pairwise
|
||||||
@ -2261,6 +2271,9 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
int link_id,
|
||||||
|
#endif
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)
|
||||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||||
#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */
|
#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */
|
||||||
@ -2281,7 +2294,11 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
|
static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
|
||||||
struct net_device *ndev, u8 key_index
|
struct net_device *ndev,
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
int link_id,
|
||||||
|
#endif
|
||||||
|
u8 key_index
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE)
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE)
|
||||||
, bool unicast, bool multicast
|
, bool unicast, bool multicast
|
||||||
#endif
|
#endif
|
||||||
@ -2329,7 +2346,11 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
|
|||||||
|
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30))
|
||||||
int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy,
|
int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy,
|
||||||
struct net_device *ndev, u8 key_index)
|
struct net_device *ndev,
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
int link_id,
|
||||||
|
#endif
|
||||||
|
u8 key_index)
|
||||||
{
|
{
|
||||||
#define SET_DEF_KEY_PARAM_FMT " key_index=%d"
|
#define SET_DEF_KEY_PARAM_FMT " key_index=%d"
|
||||||
#define SET_DEF_KEY_PARAM_ARG , key_index
|
#define SET_DEF_KEY_PARAM_ARG , key_index
|
||||||
|
@ -2154,7 +2154,11 @@ int rtw_os_ndev_register(_adapter *adapter, const char *name)
|
|||||||
u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);
|
u8 rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj);
|
||||||
|
|
||||||
#ifdef CONFIG_RTW_NAPI
|
#ifdef CONFIG_RTW_NAPI
|
||||||
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
netif_napi_add_weight(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);
|
||||||
|
#else
|
||||||
netif_napi_add(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);
|
netif_napi_add(ndev, &adapter->napi, rtw_recv_napi_poll, RTL_NAPI_WEIGHT);
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_RTW_NAPI */
|
#endif /* CONFIG_RTW_NAPI */
|
||||||
|
|
||||||
#if defined(CONFIG_IOCTL_CFG80211)
|
#if defined(CONFIG_IOCTL_CFG80211)
|
||||||
@ -4539,7 +4543,9 @@ static int route_dump(u32 *gw_addr , int *gw_index)
|
|||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
struct sockaddr_nl nladdr;
|
struct sockaddr_nl nladdr;
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
mm_segment_t oldfs;
|
mm_segment_t oldfs;
|
||||||
|
#endif
|
||||||
char *pg;
|
char *pg;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
|
||||||
@ -4578,14 +4584,18 @@ static int route_dump(u32 *gw_addr , int *gw_index)
|
|||||||
msg.msg_controllen = 0;
|
msg.msg_controllen = 0;
|
||||||
msg.msg_flags = MSG_DONTWAIT;
|
msg.msg_flags = MSG_DONTWAIT;
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
oldfs = get_fs();
|
oldfs = get_fs();
|
||||||
set_fs(KERNEL_DS);
|
set_fs(KERNEL_DS);
|
||||||
|
#endif
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
|
||||||
err = sock_sendmsg(sock, &msg);
|
err = sock_sendmsg(sock, &msg);
|
||||||
#else
|
#else
|
||||||
err = sock_sendmsg(sock, &msg, sizeof(req));
|
err = sock_sendmsg(sock, &msg, sizeof(req));
|
||||||
#endif
|
#endif
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
set_fs(oldfs);
|
set_fs(oldfs);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_sock;
|
goto out_sock;
|
||||||
@ -4610,14 +4620,18 @@ restart:
|
|||||||
iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE);
|
iov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
oldfs = get_fs();
|
oldfs = get_fs();
|
||||||
set_fs(KERNEL_DS);
|
set_fs(KERNEL_DS);
|
||||||
|
#endif
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
|
||||||
err = sock_recvmsg(sock, &msg, MSG_DONTWAIT);
|
err = sock_recvmsg(sock, &msg, MSG_DONTWAIT);
|
||||||
#else
|
#else
|
||||||
err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);
|
err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);
|
||||||
#endif
|
#endif
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
set_fs(oldfs);
|
set_fs(oldfs);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_sock_pg;
|
goto out_sock_pg;
|
||||||
@ -4688,14 +4702,18 @@ done:
|
|||||||
msg.msg_controllen = 0;
|
msg.msg_controllen = 0;
|
||||||
msg.msg_flags = MSG_DONTWAIT;
|
msg.msg_flags = MSG_DONTWAIT;
|
||||||
|
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
oldfs = get_fs();
|
oldfs = get_fs();
|
||||||
set_fs(KERNEL_DS);
|
set_fs(KERNEL_DS);
|
||||||
|
#endif
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
|
||||||
err = sock_sendmsg(sock, &msg);
|
err = sock_sendmsg(sock, &msg);
|
||||||
#else
|
#else
|
||||||
err = sock_sendmsg(sock, &msg, sizeof(req));
|
err = sock_sendmsg(sock, &msg, sizeof(req));
|
||||||
#endif
|
#endif
|
||||||
|
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0))
|
||||||
set_fs(oldfs);
|
set_fs(oldfs);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (err > 0)
|
if (err > 0)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -2914,7 +2914,9 @@ u64 rtw_division64(u64 x, u64 y)
|
|||||||
inline u32 rtw_random32(void)
|
inline u32 rtw_random32(void)
|
||||||
{
|
{
|
||||||
#ifdef PLATFORM_LINUX
|
#ifdef PLATFORM_LINUX
|
||||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
|
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
|
||||||
|
return get_random_u32();
|
||||||
|
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
|
||||||
return prandom_u32();
|
return prandom_u32();
|
||||||
#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18))
|
#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18))
|
||||||
u32 random_int;
|
u32 random_int;
|
||||||
|
@ -6,18 +6,19 @@
|
|||||||
|
|
||||||
SCRIPT_NAME="remove-driver.sh"
|
SCRIPT_NAME="remove-driver.sh"
|
||||||
SCRIPT_VERSION="20221007"
|
SCRIPT_VERSION="20221007"
|
||||||
OPTIONS_FILE="88x2bu.conf"
|
|
||||||
BLACKLIST_FILE="rtw88_8822bu.conf"
|
|
||||||
|
|
||||||
MODULE_NAME="88x2bu"
|
MODULE_NAME="88x2bu"
|
||||||
|
DRV_VERSION="5.13.1"
|
||||||
|
OPTIONS_FILE="${MODULE_NAME}.conf"
|
||||||
|
|
||||||
KVER="$(uname -r)"
|
KVER="$(uname -r)"
|
||||||
KSRC="/lib/modules/${KVER}/build"
|
KSRC="/lib/modules/${KVER}/build"
|
||||||
MODDESTDIR="/lib/modules/${KVER}/kernel/drivers/net/wireless/"
|
MODDESTDIR="/lib/modules/${KVER}/kernel/drivers/net/wireless/"
|
||||||
|
|
||||||
DRV_NAME="rtl88x2bu"
|
DRV_NAME="rtl${MODULE_NAME}"
|
||||||
DRV_VERSION="5.13.1"
|
|
||||||
DRV_DIR="$(pwd)"
|
DRV_DIR="$(pwd)"
|
||||||
|
|
||||||
|
BLACKLIST_FILE="rtw88_8822bu.conf"
|
||||||
|
|
||||||
# check to ensure sudo was used
|
# check to ensure sudo was used
|
||||||
if [[ $EUID -ne 0 ]]
|
if [[ $EUID -ne 0 ]]
|
||||||
then
|
then
|
||||||
@ -63,7 +64,7 @@ then
|
|||||||
rm -f /etc/modprobe.d/${BLACKLIST_FILE}
|
rm -f /etc/modprobe.d/${BLACKLIST_FILE}
|
||||||
echo "Deleting source files from /usr/src/${DRV_NAME}-${DRV_VERSION}"
|
echo "Deleting source files from /usr/src/${DRV_NAME}-${DRV_VERSION}"
|
||||||
rm -rf /usr/src/${DRV_NAME}-${DRV_VERSION}
|
rm -rf /usr/src/${DRV_NAME}-${DRV_VERSION}
|
||||||
echo "Removing a non-dkms installation."
|
# echo "Removing a non-dkms installation."
|
||||||
rm -f ${MODDESTDIR}${MODULE_NAME}.ko
|
rm -f ${MODDESTDIR}${MODULE_NAME}.ko
|
||||||
/sbin/depmod -a ${KVER}
|
/sbin/depmod -a ${KVER}
|
||||||
echo "The driver was removed successfully."
|
echo "The driver was removed successfully."
|
||||||
|
Loading…
x
Reference in New Issue
Block a user