code: func (nim *nodeInfoManager) UninstallCSIDriver(driverName string) error {
  	if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) {
  		err := nim.uninstallDriverFromCSINode(driverName)
  		if err != nil {
  			return fmt.Errorf("error uninstalling CSI driver from CSINode object %v", err)
  		}
  	}
  
  	err := nim.updateNode(
  		removeMaxAttachLimit(driverName),
  		removeNodeIDFromNode(driverName),
  	)
  	if err != nil {
  		return fmt.Errorf("error removing CSI driver node info from Node object %v", err)
  	}
  	return nil
  }
docs: // UninstallCSIDriver removes the node ID annotation from the Node object and CSIDrivers field from the
  // CSINode object. If the CSINOdeInfo object contains no CSIDrivers, it will be deleted.
  // If multiple calls to UninstallCSIDriver() are made in parallel, some calls might receive Node or
  // CSINode update conflicts, which causes the function to retry the corresponding update.